forEach内部的承诺结果

2 javascript node.js promise

我试图用Promise(Q)重写我的一个项目的代码。我不知道如何在一个foreach循环中采用一连串的诺言的结果:

var resProducts = [];
products.forEach(currProduct) {
     Stock.saveNewStock(currProduct)
        .then(function(res1) {
            Product.saveNewProduct(currProduct)
               .then(function(res2) {
                  resProducts.push(res2);
                  Product.addStockToProduct(res1,res2)
               })
         })
         .catch(function(err) {
             console.log(err)
         })
});
console.log(resProducts);
Run Code Online (Sandbox Code Playgroud)

我看到每次日志标记一个空数组时,如何解决它?

jib*_*jib 5

您应该始终返回所有的Promise,而您在这里的多个地方都忘记了。

如果可以使用=>箭头函数,则这些函数将隐式返回,从而避免忘记。

代替forEach使用忽略返回值,而是使用map结果并将其返回到数组中。这也可以并行进行:

Promise.all(products.map(product => Stock.saveNewStock(product)
  .then(res1 => Product.saveNewProduct(product)
    .then(res2 => Product.addStockToProduct(res1, res2)
      .then(() => res2))))
.then(resProducts => console.log(resProducts))
.catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)

这里筑巢是故意的,访问res1res2在一起。


Del*_*Del 0

您需要这样的东西吗?

var defer = $q.defer();
            var promises = [];
            var resProducts = [];
            var errorCallback = function (e) {

              defer.reject();
            };

           products.forEach(currProduct) {

                promises.push(function () {
                    Stock.saveNewStock(currProduct)
                        .then(function(res1) {
                            return Product.saveNewProduct(currProduct)
                        .then(function(res2) {
                            resProducts.push(res2);
                            Product.addStockToProduct(res1,res2)
                   })
             })
             .catch(function(err) {
                 console.log(err)
             })
                }


                );
              }

            });
            return $q.all(promises);
Run Code Online (Sandbox Code Playgroud)