Javascript 将while循环中的异步等待转换为承诺

Javascript 将while循环中的异步等待转换为承诺,javascript,async-await,ecmascript-2017,Javascript,Async Await,Ecmascript 2017,我不知道如何将while循环中的异步等待功能转换为基于承诺的实现 repl显示异步等待版本 var-dependency=false; 函数checkDependency(){ 返回新承诺(解决=>{ 设置超时(()=>{ 依赖性=真; 返回resolve(); }, 1000) }); } 异步函数isReady(){ 而(!依赖){ console.log(“未加载”); 等待checkDependency(); } console.log('loaded') } isReady()您不

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

repl显示异步等待版本

var-dependency=false;
函数checkDependency(){
返回新承诺(解决=>{
设置超时(()=>{
依赖性=真;
返回resolve();
}, 1000)
});
}
异步函数isReady(){
而(!依赖){
console.log(“未加载”);
等待checkDependency();
}
console.log('loaded')
}

isReady()您不需要while循环

checkDependency().then(()=>{console.log('loaded');})
  • 您不需要返回
    recolve()
    ,只需调用它即可
  • 调用函数
    ,然后在函数
    isReady
函数checkDependency(){
返回新承诺(解决=>{
设置超时(解析,1000);
});
}
函数isReady(){
console.log(“未加载”);
checkDependency()。然后(()=>{
console.log('loaded')
});
}

isReady()如果我理解正确,您希望使用不带异步函数的承诺,而不是带异步函数的承诺,并且示例
checkDependency
实际上可能不会在所有情况下都设置
dependency=true
,因此您希望“循环”

等价的功能可能类似于这样,您可以“递归”调用check函数。但是,它实际上不会递归并导致堆栈溢出,因为调用是在异步回调中完成的:

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')
});

您尝试了哪些不起作用的方法删除了async await并尝试了checkDependency()。然后()嗯,async await是基于承诺的,所以我不确定您在问什么?代码是否工作,有什么问题吗?顺便说一句,你的
checkDependency
函数应该用布尔值来解析返回的承诺,而不是变异一些全局
依赖项
变量。我猜这与“实际代码”相去甚远,因为有大约100种更好的编写方法:pMy fault promise中的
dependency=true
并不总是正确的,在这种情况下,它需要在运行时再次检查is@ZackLucky,似乎您有一个
false/true
值的流。你可以考虑使用。