2017-05-12 133 views
1

我有一个由Promise函数包围的文件文件。我在这个函数中有一个数据库操作,这也需要另一个承诺。请检查下面我如何在node.js的另一个promise函数中嵌套promise?

var p ; 
var ted = dep.map(function(name){ 

return new Promise(function(resolve,reject){ 
    /*..list of other tasks*/ 
    for(int i = 0 ;i<3<;i++){   
     p = Promise.resolve(savemongo(myobj,str)); // this is async function. How do I wait till this operation is complete and then move to next 
    } 
    resolve(); 

)}; 

代码现在,我一直在使用下面的代码

module.exports = Promise.all([ted,p]); 

我怎么等到我savetomongodb功能齐全该模块导出到不同的文件

林。

+0

'承诺.all'只有一个参数。顺便说一句,请正确地格式化/缩进您的代码。 –

+0

@ karthik006你无法专门请人来帮助你。堆栈溢出是一个社区,任何人都可以回答并询问。你不会问一个特定的人来帮助你... – Li357

+0

对不起,我已经更新了上面的问题 – karthik006

回答

1

围绕整个事情由一个new Promise电话没有任何帮助。在它里面,你仍然有回拨地狱。不,把Promise.resolve()扔在一个不返回任何东西的函数也没有帮助。

您需要promisify异步基元,即异步的最小部分。在你的情况,这是distance.matrix和蒙戈的connect + insert

function getMatrix(m, o, d) { 
    return new Promise(function(resolve, reject) { 
     m.matrix(o, d, function(err, distances) { 
      if (err) reject(err); 
      else  resolve(distances); 
     }); 
    }); 
} 

function save(url, store, k) { 
// cramming connect+insert in here is not optimal but let's not get into unnecessary detail 
    return new Promise(function(resolve, reject) { 
     MongoClient.connect(url, function(err, db) { 
      if (err) 
       reject(err); 
      else 
       db.collection(k).insert(store, function(err, results) { 
        if (err) reject(err); 
        else  resolve(results); 
        db.close(); 
       }); 
     }); 
    }); 
} 

现在我们有了这些,我们实际上可以使用它们,我们的承诺,组合成你实际上是在寻找:

module.exports = Promise.all(dep.map(function(name) { 
    distance.departure_time(name); 
    return getMatrix(distance, origins, destinations).then(function(distances) { 
     if (!distances) throw new Error('no distances'); 
     var promises = []; 
     if (distances.status == 'OK') { 
      for (var i=0; i < origins.length; i++) { 
       for (var j = 0; j < destinations.length; j++) { 
        var origin = distances.origin_addresses[i]; 
        var destination = distances.destination_addresses[j]; 
        if (distances.rows[0].elements[j].status == 'OK') { 
         var duration = distances.rows[i].elements[j].duration_in_traffic.value; 
         var myobj = { 
          destination: destination, 
          departure_time: name, 
          duration: duration 
         }; 
         var str = destination.replace(/[,\s]+/g, ''); 
         promises.push(save(url, myobj, str)); 
//         ^^^^^^^^^^^^^^^^^^^^^ 
        } 
       } 
      } 
     } 
     return Promise.all(promises); // now wait for all save results 
    }); 
})); 
+0

'throw new Error('no distance')'和'return Promise.reject(new Error('no distance'))''之间有什么区别?应该将'.catch()'链接到'return Promise.all(promises)'? – guest271314

+0

非常感谢@Bergi。你拯救了我的一天。我也不明白你使用Promises数组来推动保存功能的部分。你可以请澄清它,如果你不介意 – karthik006

+0

1)[无差别](http://stackoverflow.com/q/33445415/1048572)。 2)catch应该被链接到你想要处理错误的地方。 (将它链接到'Promise.all(promises)'将从'save'调用中捕获)。 3)不推动'save'函数,*调用'save'函数并将返回的promise放入该数组中。就像你最初使用'dep.map(...)' – Bergi

相关问题