javascript 怎么在回调函数内,修改外部变量?

发布于 2022-08-25 01:17:32 字数 617 浏览 14 评论 0

想给变量数组填充内容,但是发现回调后,因为作用域的原因而没有改变原值

   
    var list = new Array();
    function get_time_line(){
	var value = new Array();//value是一个空数组
	list.forEach(function(key,i){
    	        db.hget(key, 'time_line', function(err,reply) {
		    value[key]=reply;
		//这里想读取redis的相应值,给value填充内容
    	        });
	});
	res.render('index', {value : value});
	console.log(value);//但是输出却是空的[]
	db.quit;
    };
    function get_Index(){
	db.keys('tencent:uid:*', function (err, replies) {
	    replies.forEach(function (key, i) {
		list.push(key);
	    });
	    get_time_line();
	});
    }

请问怎么才能把value的值填充完后再调用?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

断念 2022-09-01 01:17:32

如果要保障循环中的异步请求都返回时才进行下一步,请使用相应的流程管理工具,比如async https://github.com/caolan/async

var async = require('async');

function get_time_line() {

	var list = []; // List 不能为一个空数组,不然循环个屁啊

	var getValue = function(li,oneDone){
		// li.key 是你每个数组元素中的参数,你自己改吧
		db.hget(li.key, 'time_line', function(err, reply) {
			// 存到每个元素里去
			li['newValue'] = reply;
			// 做好了
			oneDone()
		});
	}

	async.each(lists,getValue,function(err,result){
		if (!err) {
			// 全都抓完了,输出最后有newValue的list
			console.log(lists);
			// do sth. else
		}
	});
};
一杆小烟枪 2022-09-01 01:17:32

你的操作都是异步的,所以在你获取value的填充内容的时候,值还没有填进去。

你需要一个异步同步化的模块,或者是成组异步执行完毕后回调的模块来辅助你。

例如:http://www.html-js.com/archives/1474

不过我这个玩意比较老了,现在有一些比较通用的,例如Async.js https://github.com/caolan/async

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文