Yuk*_*des 2 javascript mongoose node.js promise
我想在我的代码的一部分中进行同步循环.saveInDatabase函数检查数据库中是否已存在项标题(字符串).这就是为什么它不能并行解决,否则条件永远不会适用(并会产生重复).
Promise.all(arr.map(item => {
saveInDatabase(item).then((myResult) => ... );
}));
Run Code Online (Sandbox Code Playgroud)
我试图将此函数封装到单独的promises中,也尝试使用npm包(synchronous.js,sync),但似乎它不适合我的代码.
也许这个解决方案完全愚蠢.您是否认为通过同步循环(例如foreach)替换promise.all更好?问题是我需要每次迭代的结果......
我正在使用Node 6.11.2.你能给我一些处理它的提示吗?先感谢您.
jfr*_*d00 12
不使用await(不在node.js v6.11.2中,但会使这更简单),序列化一堆返回promise的异步操作的经典模式是使用这样的reduce()循环:
arr.reduce(function(p, item) {
return p.then(function() {
return saveInDatabase(item).then((myResult) => ... );
});
}, Promise.resolve()).then(function() {
// all done here
}).catch(function(err) {
// error here
});
Run Code Online (Sandbox Code Playgroud)
如果要保存所有结果,可以使用.then(myResult => ...)处理程序.push()将结果导入到完成后可以访问的数组中.
这将序列化所有saveInDatabase(item)对它的调用,等待第一个调用之后再调用第二个,在调用第三个之前等待第二个调用,等等...
如果saveInDatabase(item)拒绝,此处的默认实现将停止.如果你想继续(你没有在你的问题中说),即使它给出了错误,那么你可以添加一个.catch()来将被拒绝的承诺变成一个履行的承诺.
在node.js v7 +中,您可以await在常规for循环中使用:
async function myFunc() {
let results = [];
for (let item of arr) {
let r = await saveInDatabase(item).then((myResult) => ... );
results.push(r);
}
return results;
}
myFunc().then(function(results) {
// all done here
}).catch(function(err) {
// error here
});
Run Code Online (Sandbox Code Playgroud)
如果您可以并行运行所有请求,那么您可以这样做:
Promise.all(arr.map(item => {
return saveInDatabase(item).then((myResult) => ... );
})).then(function(results) {
// all done here
}).catch(function(err) {
// error here
});
Run Code Online (Sandbox Code Playgroud)
在任何这些中,如果您不希望它在拒绝时停止,那么添加一个.catch()到您的saveInDatabase()保证链,将拒绝转换为已解决的承诺,其中包含您可以检测到的某些已知值或错误值.
| 归档时间: |
|
| 查看次数: |
4992 次 |
| 最近记录: |