【问题标题】:Convert async await in while loop to promises将while循环中的异步等待转换为承诺
【发布时间】:2018-08-13 14:28:53
【问题描述】:

我不知道如何将 while 循环中的异步等待功能转换为基于 Promise 的实现。

repl 显示异步等待版本

https://repl.it/repls/IdealisticPepperyCoding

var dependency = false;

function checkDependency() {
  return new Promise(resolve => {
    setTimeout(() => {
      dependency = true;
      return resolve();
    }, 1000)
  });
}

async function isReady() {
    while(!dependency) {
      console.log('not loaded');
      await checkDependency();
    }
    console.log('loaded')
}

isReady();

【问题讨论】:

  • 你试过什么没用
  • 移除了异步等待并尝试了 checkDependency().then()
  • 呃,async-await 基于承诺的,所以我不确定你在问什么?代码行不行,有什么问题?
  • 顺便说一句,您的 checkDependency 函数应该使用布尔值解析返回的承诺,而不是改变一些全局 dependency 变量。
  • 我猜这与“实际代码”相去甚远,因为有大约 100 种更好的方法来编写它:p

标签: javascript async-await ecmascript-2017


【解决方案1】:

如果我对您的理解正确,您希望使用 Promises without 异步函数而不是 Promises with 异步函数,示例 checkDependency 实际上可能在所有情况下都没有设置dependency = true,所以你想“循环”。

等效功能可能看起来像这样,您可以“递归”调用检查功能。不过,它实际上不会递归并导致堆栈溢出,因为调用是在异步回调中完成的:

var dependency = false;

function checkDependency() {
  return new Promise(resolve => {
    setTimeout(() => {
      dependency = true;
      return resolve();
    }, 1000)
  });
}

function isReady() {
  if (!dependency) {
    return checkDependency().then(isReady);
  }

  return Promise.resolve(true);
}

isReady().then(() => {
  console.log('loaded')
});

【讨论】:

    【解决方案2】:
    • 您无需返回recolve(),只需调用它即可。
    • 在函数isReady内调用函数then

    function checkDependency() {
      return new Promise(resolve => {
        setTimeout(resolve, 1000);
      });
    }
    
    function isReady() {
      console.log('not loaded');
      checkDependency().then(() => {
        console.log('loaded')
      });
    }
    
    isReady();

    【讨论】:

      【解决方案3】:

      您不需要 while 循环。

      checkDependency().then(() => { console.log('loaded');});

      【讨论】:

      • 我的错,承诺中的dependency = true 并不总是正确的,在这种情况下它需要再次检查
      • @ZackLucky,您似乎有一个false/true 值的流。你可以考虑使用RxJS stream extensions
      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 2015-11-13
      • 2021-10-03
      • 2017-06-15
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多