gpt4 book ai didi

javascript - 如何在 Node.js 中将 Promise 嵌套在另一个 Promise 函数中?

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:52 25 4
gpt4 key购买 nike

我有一个被 Promise 函数包围的文件 file。我在这个函数中有一个数据库操作,它也需要另一个 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 功能完成。

最佳答案

通过一个 new Promise 调用来包围整个事情没有任何帮助。在它里面,你仍然会遇到回调 hell 。不,在不返回任何内容的函数上抛出 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();
});
});
});
}

现在我们已经有了这些,我们可以实际使用它们并将我们的 promise 结合到您实际正在寻找的内容中:

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
});
}));

关于javascript - 如何在 Node.js 中将 Promise 嵌套在另一个 Promise 函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43928459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com