Javascript 如何将承诺嵌套在node.js中的另一个承诺函数中?

Javascript 如何将承诺嵌套在node.js中的另一个承诺函数中?,javascript,node.js,mongodb,promise,Javascript,Node.js,Mongodb,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(savemo

我有一个被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();

)};

如何等待savetomongodb功能完成

用一个
新承诺
电话把整件事都围绕在一起,没有任何帮助。在里面,你仍然有地狱。不,对不返回任何内容的函数抛出
Promise.resolve()

您将需要使用异步原语,即异步的最小部分。在您的例子中,这就是距离矩阵和mongo的连接:

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
    });
}));
module.exports=Promise.all(dep.map)函数(名称){
距离、出发时间(姓名);
返回getMatrix(距离、起点、目的地)。然后返回函数(距离){
如果(!距离)抛出新错误(“无距离”);
var承诺=[];
如果(distance.status==“OK”){
对于(变量i=0;i
承诺。所有
只接受一个参数。顺便说一下,请正确格式化/缩进您的代码。@karthik006您不能特别要求别人帮助您。堆栈溢出是一个社区,任何人都可以回答和询问。你不需要请特定的人来帮助你…抱歉,伙计们,我更新了上面的问题。是否
savetomongodb()
调用返回
承诺
?你的循环没有意义,你没有使用
I
param1
param2
在任何地方都没有定义可见的区别,如果有的话,在
抛出新错误(“无距离”)
返回承诺之间。拒绝(新错误(“无距离”))
?是否应该将
.catch()
链接到
返回承诺。所有(承诺)
?非常感谢@Bergi。你救了我一天。另外,我不理解您使用Promissions数组来推动save函数的部分。如果你不介意的话,请你澄清一下好吗。2)
catch
应链接到要处理错误的位置。(将其链接到
Promise.all(promises)
将捕获
save
调用中的承诺)。3) 不按下
save
函数,调用
save
函数并将返回的承诺放入该数组。就像您最初使用
dep.map(…)
优秀的解决方案所做的一样
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
    });
}));