当前位置: 首页 > 知识库问答 >
问题:

等待许诺,一切都不是有效的

夏宪
2023-03-14

下面是我的异步函数从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在这里似乎没有任何作用。

任何关于为什么等待的帮助在这种情况下都不起作用?

共有2个答案

齐昊焱
2023-03-14

您在这里缺少一个await:

(async function() {
  console.log('calling readValuesFromDB()');
  await readValuesFromDB();
  console.log('finished readValuesFromDB()');
})();
田嘉慕
2023-03-14

这种行为是正常的。

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链。你可以这样做: 但是有人告诉我,等待一个诺言链可能会导致错误,或者会破坏我的代码。如果上面的第一个代码段与第二个代码段执行相同的操作,那么使用哪个代码段有什么关系呢。第一段不会引入第二段带来的危险? 问题答

  • 问题内容: 我需要等到我所有的ajax函数都完成后,再继续执行。 我的特殊情况是,在提交表单之前,我需要翻译表单中的某些字段。我通过ajax调用将其转换为外部站点。根据表单中的某些值,我需要进行更多或更少的翻译。完成所有翻译后(如果有),我必须使用ajax验证表单,如果表单有效,则提交。 这是我的方法: 首先,我有一个函数发送ajax调用并对接收到的数据进行处理: 然后,当要提交表单时,我将执行以

  • 上面的代码工作得很好,但如果我使用wait而不是thread。sleep I get StaleElementReferenceException异常。这是我使用的流畅等待: 这将找到combobox,但再次对combobox执行任何操作将导致NoTouchElement或statestate异常。所以我也尝试了从combobox中选择值: 这超时和doesnot工作! 我如何才能使这项工作,为什