for循环中的嵌套promise未按预期运行
Nested promise in a for loop not behaving as expected
在.then()
内部扩展Promise
时遇到问题。我正在尝试在for循环中执行数据库更新,然后在处理完所有记录后关闭数据库。然而,应用程序会立即退出process.exit()
,这意味着process.exit()
甚至在所有数据库更新完成之前就已执行。我很确定我在嵌套的promise上做错了什么。
var myDB;
function doSomething() {
return MongoClient.connect(DB_CONNECTION).then(function(db) {
myDB = db;
var collection = db.collection(COLLETION_NAME);
for (var i = 0; i < 10; i++) {
promise.then(function{
collection.update({
symbol: items[i].symbol
}, {
$set: {
value: 123
}
}, {
upsert: true
});
});
}
})
}
var promise = doSomething();
promise.then(function(){
console.log("DONE");
myDB.close();
process.exit();
});
看起来你从MongoClient.connect方法中得到了一个promise,为什么不使用它来链接在一起呢。我根据你的代码在下面放了一个快速样本:
function doSomething(db) {
return new Promise(function(resolve, reject){
var collection = db.collection(COLLETION_NAME);
for (var i = 0; i < 10; i++) {
collection.update({
symbol: items[i].symbol
}, {
$set: {
value: 123
}
}, {
upsert: true
});
}
resolve(db);
})
}
function connectToDB() {
return MongoClient.connect(DB_CONNECTION);
}
function closeDB(db) {
return new Promise(function(resolve, reject){
db.close();
resolve();
});
}
connectToDB().then(function(db){
return doSomething(db);
}).then(function(db){
return closeDB(db);
}).then(function(){
console.log("DONE");
process.exit();
}).catch(function(error){
console.log('Something went wrong: ' + error);
});
根据@RayonDabre的建议更新代码
function doSomething() {
return MongoClient.connect(DB_CONNECTION).then(function(db) {
myDB = db;
var collection = db.collection(COLLECTION_NAME);
var promises = [];
for (var i = 0; i < 10; i++) {
var innerPromise = collection.update({
symbol: items[i].symbol
}, {
$set: {
value: 123
}
}, {
upsert: true
});
promises.push(innerPromise);
}
return Promise.all(promises);
});
}
var promise = doSomething();
promise.then(function(){
console.log("DONE");
myDB.close();
process.exit();
});
相关文章:
- Promise函数在.then之后未运行函数化
- 在promise完成后,依次运行返回promise的函数
- ES2015 Promise链-为什么promiseized函数会立即运行
- 运行Promise.all()中的When-is-then-then子句
- 缓存的$q promise在测试中运行时不会解析
- Angular Promise未同步运行
- 如何在解析Promise时运行qunit断言
- for循环中的嵌套promise未按预期运行
- 在NodeJS中使用promise时未运行Console.log
- 为什么不是't Promise中延迟运行的回调
- angularjs$q在序列上运行多个promise
- 与promise串联运行异步函数
- 使用 setTimeout 在不阻止输入的情况下运行大型任务,并使用 Promise 找出任务何时完成
- JavaScript 运行时错误:“Promise”未定义
- 将一个q promise数组拆分为多个数据包,并依次运行这些数据包
- Bluebird:运行promise返回函数序列
- 如何在Javascript中使用Q顺序运行promise
- 如何在promise或callback中运行“yield next”
- 使用Q动态运行一系列promise
- 如何在任意数量的链元素上使用map或reduce来运行promise-then链