Javascript Nodejs值未推入数组[重复]
Posted
技术标签:
【中文标题】Javascript Nodejs值未推入数组[重复]【英文标题】:Javascript Nodejs Value not pushing into array [duplicate] 【发布时间】:2017-03-28 16:11:22 【问题描述】:module.exports.findUser = function(query)
var result = [];
User.find(query, function(err, data)
result.push(data);
);
return result;
我尝试将数据数组推送到结果中,但一直返回一个空数组。
【问题讨论】:
find
看起来是异步的,所以你在完成之前就返回了
【参考方案1】:
User.find()
是异步的,因此您不能立即返回值。你有两种选择来解决这个问题:
选项 1:
接受一个回调参数并在结果准备好时调用它:
module.exports.findUser = function(query, cb)
var result = [];
User.find(query, function(err, data)
result.push(data);
cb(err, result);
);
常见的 Node.js 约定是具有第一个参数 err
的回调,这将返回任何错误,第二个参数是您返回的实际数据。
这将被用作:
findUser('query', function (err, data)
if (err) throw new Error(err);
console.log(data);
);
选项 2:
返回一个Promise
,然后可以链接。这不是非常常见的 Node.js 约定(选项 1 是),但它正变得越来越普遍,并且可能在一两年内成为常态:
module.exports.findUser = function(query)
return new Promise(function(resolve, reject)
var result = [];
User.find(query, function(err, data)
err && reject(err) || result.push(data) && resolve(result);
);
这样使用:
findUser('query').then(result => console.log(result)).catch(err => throw new Error(err));
【讨论】:
它只是返回给我 [ Promisethen
.. 例如。 findUser('xyz').then(function (data)
This isn't super common Node.js convention
Finger crossed 这将改变,我听说 Node 开发人员甚至正在考虑基于内置的 Promise .. 使用 async
和 await
会很棒。 .
@Keith 我注意到 Promises 也越来越流行,这让我很高兴。我是诺言的忠实粉丝。有趣的是,你实际上也可以同时做这两个,接受回调并返回一个 Promise。它们并不相互排斥。以上是关于Javascript Nodejs值未推入数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章