下面是我的异步函数从DB中读取值并在控制台上记录一些东西。但由于某种原因它没有发生。
因此,我创建了一个许诺数组,然后继续等待所有许诺的解决,因为许诺将从DB读取。但await on promission.all不是暂停代码的执行,也不是等待all promission解析,而是将控制权传递回调用函数。我这里有没有遗漏什么东西?
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 with promission.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
...
...
因此,在将控制传递回调用函数后,承诺似乎得到了解决,并且await在这里似乎没有任何作用。
任何关于为什么等待的帮助在这种情况下都不起作用?
您在这里缺少一个await:
(async function() {
console.log('calling readValuesFromDB()');
await readValuesFromDB();
console.log('finished readValuesFromDB()');
})();
这种行为是正常的。
readValuesFromDB
是异步运行的,而不是console.log('finished readValuesFromDB()');
因此控制台在readValuesFrom DB解析之前解析“finished”。
您可以这样做:
null
js prettyprint-override">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
let allPromises = await Promise.all(dbPromises);
for(let i in allPromises) {
console.log('OK..read from DB');
}
console.log('all promises resolved');
console.log('finished readValuesFromDB()');
}
console.log('calling readValuesFromDB()');
readValuesFromDB();
问题内容: 我目前正在等待所有承诺按顺序完成,如下所示: 但是,通过这种方式,配置文件和令牌将顺序执行。由于两者彼此独立,因此我希望两者一起独立执行。我认为可以使用Promise.all完成此操作,但是我不确定语法,也找不到任何帮助。 所以我的问题是如何转换上面的api调用以一起运行,然后返回最终输出。 问题答案:
问题内容: 因此,我遇到了多个未知长度的promise链的情况。我希望在处理所有链条后执行一些操作。那有可能吗?这是一个例子: 在此示例中,我设置了一个承诺1,,2和3,这些承诺会在某个随机时间得到解决。然后,我将诺言添加到第一和第三的结尾。我想在所有链条都解决后解决。这是运行此代码时的输出: 有没有办法等待连锁解决? 问题答案: 当所有链条都解决后,我希望所有人解决。 当然,然后将每个链的承诺传
Ubuntu 20 节点12.18。4 npm6.14。6 续集6.3。5. 我遵循官方指南,现在感到很困惑 成功配置Sequelize并连接后,我尝试运行(来自官方文档) 它抛出。 在正式开始页面https://sequelize.org/master/manual/getting-started.html,它清楚地指出: Sequelize提供的大多数方法都是异步的,因此会返回Promises
问题内容: 我正在开发Angular 6应用程序,并且被告知以下内容是反模式: 我意识到等待承诺链毫无意义。如果someFunction()返回Promise,则在等待时不需要Promise链。你可以这样做: 但是有人告诉我,等待一个诺言链可能会导致错误,或者会破坏我的代码。如果上面的第一个代码段与第二个代码段执行相同的操作,那么使用哪个代码段有什么关系呢。第一段不会引入第二段带来的危险? 问题答
上面的代码工作得很好,但如果我使用wait而不是thread。sleep I get StaleElementReferenceException异常。这是我使用的流畅等待: 这将找到combobox,但再次对combobox执行任何操作将导致NoTouchElement或statestate异常。所以我也尝试了从combobox中选择值: 这超时和doesnot工作! 我如何才能使这项工作,为什
问题内容: 我有一个对象列表。对象将传递给延迟函数。我只想在上一次调用解决后才使用下一个对象调用函数。有什么办法可以做到吗? 问题答案: 在ES2017之前和之后(请参见下文中的ES2017中的选项),如果要等待诺言就不能使用,因为诺言没有阻塞。Javascript和Promise不会那样工作。 您可以链接多个promise,并使promise基础结构对它们进行排序。 您可以手动进行迭代,并且仅在