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));

【讨论】:

它只是返回给我 [ Promise , Promise ] 没错,它应该返回一个承诺.. 你快到了.. 基本上你需要附上一个then.. 例如。 findUser('xyz').then(function (data) This isn't super common Node.js convention Finger crossed 这将改变,我听说 Node 开发人员甚至正在考虑基于内置的 Promise .. 使用 asyncawait 会很棒。 . @Keith 我注意到 Promises 也越来越流行,这让我很高兴。我是诺言的忠实粉丝。有趣的是,你实际上也可以同时做这两个,接受回调并返回一个 Promise。它们并不相互排斥。

以上是关于Javascript Nodejs值未推入数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs 推入数组在异步函数中不起作用

在Javascript(jQuery)中将数组推入数组

JavaScript对象推入数组[重复]

Javascript将对象推入数组

将对象推入javascript深拷贝还是浅拷贝中的数组?

如何将一个数组推入另一个数组元素中作为 JavaScript 中的新属性? [复制]