【问题标题】:Error Promise.all错误 Promise.all
【发布时间】:2018-08-01 14:38:13
【问题描述】:

我正在尝试使用 Promise.all 函数,但实际上当我启动 nodeJS 并发现异步技术时,我不知道我的代码中的问题在哪里...... 基本上我想使用 Promise.all 在函数中进行自己的回调,然后在我的循环中创建几个 Promise,如果我可以保存我的数据,那么我将解决我当前的 Promise。 但显然我的 promise.all 会立即执行,它不会等待我的其他 Promise.. 见下文..

function persistMAP(jsonData,callback){
//Deck persistance
const promises  =[];
for(var i=0; i<1; i++){
    (function(i) {
        var rowData = new DeckDatabase({ 
            _id: new mongoose.Types.ObjectId(),
            DeckNumber: Number(jsonData.Deck[i].DeckNumber),
            x: Number(jsonData.Deck[i].x),
            y: Number(jsonData.Deck[i].y),
        });
        rowData.save(function (err) {
            if (err) return console.log(err);

            for(var index=0; j=jsonData.Units.length,index<j; index++){
                (function(index) {
                    promises.push(
                        new Promise(function(resolve,reject){
                            var unit = new MapDatabase({ 
                                UnitID:jsonData.Units[index].UnitID,
                                TypeID: Number(jsonData.Units[index].TypeID),
                                x: Number(jsonData.Units[index].x),
                                y: Number(jsonData.Units[index].y),
                                _id: mongoose.Types.ObjectId(((jsonData.Units[index].Code).toLowerCase()) + 'dd40c86762e0fb12000003'), // mongoose.Types.ObjectId(jsonData.Units[i].Code + 'dd40c86762e0fb12000003')
                                MainClass: jsonData.Units[index].MainClass,
                                Orientation: jsonData.Units[index].Orientation,
                                Postion: jsonData.Units[index].Postion,
                                Deck : String(rowData._id)
                            });

                            unit.save(function (err) {
                                if (err) {
                                    reject();
                                    throw err
                                }
                                else{
                                    console.log('save');
                                    resolve(); 
                                }

                            });

                        }) 
                    );

                })(index);
            }   

          });

    })(i);
} 
Promise.all(promises)
.then(()=>{
    console.log('start find');
    callback(); 
})  
};

这是我调用函数的地方

else{
 var jobj = JSON.parse(response.body);
 console.log("persist begin");
 persistMAP(jobj,function(){
       console.log('retrieve Done');
       MapDatabase.find()
        .populate('Deck')
        .exec(function(err, finalData){
            console.log('send');
            res.send(finalData);
        })
 }); 
}

那么为什么它不等待呢? :(

【问题讨论】:

  • 它适用于超时但还有另一种方法吗?因为我发现这种超时的使用确实不是一种正确的方法,因为基本上设置的时间是随机的,我的意思是它没有优化

标签: node.js loops for-loop callback


【解决方案1】:

您在 for: 中执行异步操作:

for(var i=0; i<1; i++){
    ....
    rowData.save(function (err) {

所以你的 promises 数组没有被所有的 promise 填满。

要循环异步使用异步模块:

var async = require("async");
var models = []; // my models array

// async loop, with 10 in same time, e is the element, i the index in models
async.eachOfLimit(models, 10, function(e, i, cb){

   anAsyncFunction(function(err){
      return cb(err);
   });

}, function(err, result{

     // all done
});

【讨论】:

    猜你喜欢
    • 2020-09-19
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2018-03-26
    • 2018-09-19
    • 2018-04-20
    • 2019-07-28
    相关资源
    最近更新 更多