【问题标题】:How do i nest a promise inside another promise function in node.js?如何在 node.js 中的另一个 Promise 函数中嵌套一个 Promise?
【发布时间】:2017-10-11 05:25:49
【问题描述】:

我有一个被 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 功能完成。

【问题讨论】:

  • Promise.all 只接受一个参数。顺便说一句,请正确格式化/缩进您的代码。
  • @karthik006 你不能专门找人帮你。 Stack Overflow 是一个社区,任何人都可以回答和提问。你不能要求特定的人来帮助你......
  • 对不起,我已经更新了上面的问题
  • savetomongodb() 调用是否返回Promise?
  • 你的循环没有意义,你没有使用 i 和 param1 和 param2 没有在任何可见的地方定义

标签: javascript node.js mongodb promise


【解决方案1】:

用一个new Promise 电话包围整个事情并没有任何帮助。在它里面,你仍然会有回调地狱。不,将Promise.resolve() 扔到一个不返回任何内容的函数上也无济于事。

您将需要promisify 异步原语,即异步的最小部分。在你的情况下,那是 distance.matrix 和 mongo 的 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
    });
}));

【讨论】:

  • throw new Error('no distances') 和return Promise.reject(new Error('no distances')) 之间有什么区别(如果有)? .catch() 是否应该链接到 return Promise.all(promises)?
  • 非常感谢@Bergi。你拯救了我的一天。另外,我不明白您使用 promises 数组推送保存功能的部分。如果您不介意,请您澄清一下
  • 1) Not a difference。 2) catch 应该链接到您要处理错误的位置。 (将其链接到 Promise.all(promises) 将捕获来自 save 调用的那些)。 3) 不推送save 函数,调用 save 函数并将返回的promise 放入该数组。就像您最初使用 dep.map(…) 所做的一样
  • 优秀的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2018-02-24
  • 1970-01-01
  • 2017-07-31
  • 2023-03-31
  • 1970-01-01
  • 2019-10-21
相关资源
最近更新 更多