Node.js的承诺:异步推送到数组并保存

克劳迪

我目前正在尝试从通过请求收到的项目列表中推送到数组(Mongo模型中的属性)。从这些项目中,我遍历它们以查看数据库中当前存在哪个项目,如果不是这种情况,那么我创建一个新项目并尝试保存它。我正在使用诺言来完成此任务,但是我无法弄清为什么在所有诺言都实现后数组为空。

var q     = require('q');

var items_to_get = ['1', '2', '3']; // example array

var trans = new Transaction({
    items   : []
});

var promises = [];

for (var i = 0; i < items_to_get.length; i++) {

  var ith = i; //save current i, kinda hacky
  var deferred = q.defer(); //init promise

  //find an existing item
  Item.findOne({simcode: items_to_get[ith]}, function(err, item) {
      trans.items.push(item); // push item to transaction
      deferred.resolve(item); // resolve the promise
  });
  promises.push(deferred); // add promise to array, can be rejected or   fulfilled
};

q.allSettled(promises).then(function(result) {
  console.log(trans.items); //is empty
  trans.save();
}

编辑解决:以下代码基于http://jsbin.com/bufecilame/1/edit?html,js,output ..点数转到@macqm

var items_to_get = ['1', '2', '3'];
var promises     = []; //I made this global

items_to_get.forEach(item) {
  upsertItem(item);
}

q.allSettled(promises).then(function(result) {
  //loop through array of promises, add items 
  result.forEach(function(res) { 
    if (res.state === "fulfilled") {
      trans.items.push(res.value);
    }
  });
  trans.save();
  promises = []; //empty array, since it's global.
}

//moved main code inside here
function upsertItem(item) {
  var deferred = q.defer(); //init promise
  //find an existing item
  Item.findOne({simcode: item}, function(err, item) {
    deferred.resolve(item); // resolve the promise
    // don't forget to handle error cases
    // use deffered.reject(item) for those
  });
  promises.push(deferred); // add promise to array
}
彼得·瓦格纳

代替

promises.push(deferred);

...尝试...

promises.push(deferred.promise);

同样,由于您的诺言正在解决仍保存的项目,因此您可以将结果q.allSettled(...)用作项目:

q.allSettled(promises).then(function(results) {
    trans.items = results;
    trans.save();
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js的承诺:异步推送到数组并保存

来自分类Dev

在MongoDB Node.js中将对象推送到数组

来自分类Dev

值未推送到node.js中的数组

来自分类Dev

Node.js推送到数组内部以进行请求循环

来自分类Dev

Node.JS - 承诺异步/等待示例

来自分类Dev

Node.js无法使用Promise,Mongoose和GET请求推送到全局数组

来自分类Dev

我无法使用node.js将数组推送到mongodb文档

来自分类Dev

Node.js承诺:获取并保存结果

来自分类Dev

MongoDB 和 Node.js - 将整个模型推送到 ref 数组和推送 id 之间的区别

来自分类Dev

Node JS无法解析承诺数组

来自分类Dev

Node.js承诺,异步或仅回调

来自分类Dev

Node.js承诺异步/等待无法正常工作

来自分类Dev

Node.js异步MongoDB保存或更新

来自分类Dev

无法将我的node.js应用推送到Heroku

来自分类Dev

Node.js异步数组迭代

来自分类Dev

异步数组的node.js安全

来自分类Dev

Node.js异步数组迭代

来自分类Dev

Node js中的条件承诺

来自分类Dev

Node.js对象承诺

来自分类Dev

Node JS:如何承诺 For 循环

来自分类Dev

使用Node.js异步保存到dynamodb

来自分类Dev

嵌套承诺不推送到数组

来自分类Dev

如何在不使用Node JS调用函数的情况下将函数调用推送到数组中以使用Q?

来自分类Dev

由于Node.js的异步特性而获取空数组

来自分类Dev

在Node.js异步中设置JSON数组

来自分类Dev

数组中每个节点的 node.js 异步瀑布

来自分类Dev

填充异步函数后返回数组 - Node.js

来自分类Dev

在Node.js中将异步代码转换为Q /承诺代码

来自分类Dev

纯JavaScript +蓝鸟承诺异步for / while循环而无需使用NODE.JS