【发布时间】:2018-10-27 16:38:24
【问题描述】:
下面是我的 async 函数,用于从数据库读取值并在控制台上记录一些内容。但由于某种原因,它没有发生。
所以,我创建了一组承诺,然后继续等待所有承诺解决,因为承诺将从数据库中读取。但是 Promise.all 上的 await 并没有暂停代码的执行,也没有等待所有承诺解决,而是将控制权传递回调用函数。 我在这里有什么遗漏吗?
async function readValuesFromDB(codes) {
console.log('trying to read values from DB');
let dbPromises = [];
for(let code in codes) {
let refId = 'some_random_reference_id_generated_from_codes[i]';
dbPromises.push(MyDb.getPromise(refId)); // getPromise() returns a promise that reads from DB
}
console.log('waiting for all promises to resolve...');
// waiting for all promises to finish
await Promise.all(dbPromises).then((allPromises) => {
for(let i in allPromises) {
console.log('OK..read from DB');
}
});
console.log('all promises resolved');
}
console.log('calling readValuesFromDB()');
readValuesFromDB();
console.log('finished readValuesFromDB()');
上述调用的输出是:
trying to read values from DB
waiting for all promises to resolve...
finished readValuesFromDB
......
......
OK..read from DB
OK..read from DB
OK..read from DB
...
...
all promises resolved
理想的输出应该在下面(因为我正在等待使用 await 和 Promise.all 解决所有承诺)
trying to read values from DB
waiting for all promises to resolve...
OK..read from DB
OK..read from DB
OK..read from DB
...
...
因此,在控件传递回调用函数后,promise 似乎正在得到解决,并且似乎 await 在这里没有任何效果。
关于为什么 await 在这种情况下无效的任何帮助?
【问题讨论】:
-
调用
readValuesFromDB()时,您没有使用await,因此它不会等待函数在那里完成。 PS:我不会混合使用async/await和Promise.then()语法。 -
@Sirko 表示调用
readValuesFromDB()的函数应该是async too? -
或者使用
readValuesFromDB().then( () => console.log('finished readValuesFromDB()') )。 -
@Sirko。你对混合等待/然后是正确的。它的工作,但过于强调。我已经相应地编辑了我的答案
-
Don't use
for…inenumerations on arrays! 还有,既然有await,为什么还要用then?
标签: javascript node.js promise async-await es6-promise