如何从函数获取数据到变量[重复]

Posted

技术标签:

【中文标题】如何从函数获取数据到变量[重复]【英文标题】:How to get data from function to variable [duplicate] 【发布时间】:2017-09-03 16:42:03 【问题描述】:

我正在学习 node.js,但遇到了问题。如何从函数中获取数据到变量?

function loadOrInitializeTaskArray(file, cb) 
        fs.exists(file, function(exists) 
                var tasks = [];
                if (exists) 
                    fs.readFile(file, 'utf8', function(err, data) 
                            if (err) throw err;
                            var data = data.toString();
                            var tasks = JSON.parse(data || '[]');
                            cb(tasks);
                    )
                 else 
                        cb([]);
                
        )




function listTasks(file) 
        loadOrInitializeTaskArray(file, function(tasks) 
                for (var i in tasks) 
                        console.log(tasks[i]);
                
        )

函数 listTasks 工作正常,但我想创建自己的函数,例如 customListTasks:

function customListTasks(file) 
        var list = loadOrInitializeTaskArray(file, function());
        console.log(list);

这不会返回错误,但列表中的 console.log 会返回“未定义”。我怎样才能把这些数据放到变量列表中?

【问题讨论】:

使用 Bluebird 协程函数并使用它可以产生 Promise ***.com/questions/5010288/… 您不能期望同步获得异步结果。您必须异步获取它(回调、承诺)。 【参考方案1】:

简短的回答:你不能。

因为loadOrInitializeTaskArray 中的加载是异步的,所以所有魔法都必须在您传递的回调中发生。您不能只从中“返回”一个值。

选项 1: 将所有依赖于加载数据的逻辑放在作为回调传递的匿名函数中。

var list = loadOrInitializeTaskArray(file, function(tasks)
    console.log(tasks);
);

选项 2: 使用 Promises。它们基本上像回调一样工作,但稍微灵活一些,并且使链接更容易。

【讨论】:

以上是关于如何从函数获取数据到变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用函数获取变量的值(将变量从函数传递到子例程)[重复]

无法将数据从地理编码器保存到全局变量 [重复]

如何从一个文件中的函数获取数据到另一个文件

jQuery post ajax函数[重复]

如何使用范围外的javascript变量? [重复]

如何从用户那里获取多行输入[重复]