【问题标题】:How to make Promise resolve to trigger in the else statement javascript? [duplicate]如何使 Promise 解析在 else 语句 javascript 中触发? [复制]
【发布时间】:2020-05-27 18:12:58
【问题描述】:

如您所见,它仅打印 console.log("Testing") 而不会继续处理 asyncCall 中的其他日志

let i = 0;
function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      if (i < 3) {
        console.log("Testing");
        resolveAfter2Seconds();
      } else {
        resolve("READY DONE!");
      }
      i++;
    }, 2000);
  });
}

async function asyncCall() {
  console.log("calling");
  const result = await resolveAfter2Seconds();
  // expected output: 'resolved'
  console.log("waiting for result");
  console.log(result);

  console.log("send array");
}

asyncCall();

【问题讨论】:

  • 你永远不会兑现你做出的第一个承诺。您只需递归调用该函数并最终解决进一步的承诺之一,但不是顶级承诺。
  • 任何示例谢谢。那么可能是存储所有的承诺并一次性解决所有问题?
  • 这将解决您的问题:resolveAfter2Seconds().then(resolve);,因为并非所有路径都指向承诺的解决方案。
  • if (i &lt; 3) { console.log("Testing"); resolveAfter2Seconds().then(resolve); }
  • 你会的。当您最终进入else 一次时,您只会解决最顶层的承诺(以及整个链)。在那之前,你会堆积待处理的 Promise,然后像多米诺骨牌一样一次性解决它们。

标签: javascript promise


【解决方案1】:

我希望这会有所帮助。

let i = 0;
function resolveAfter2Seconds() {
  return new Promise((resolve, reject) => {
    const resolveFn = resolve;
    setTimeout(function tick(){
      if(i != 3){
        i++;
        console.log(i);
        setTimeout(tick, 1000);
      }else{
        resolveFn("READY DONE!");
      }
    }, 1000);
  });
}

async function asyncCall() {
  console.log("calling");
  const result = await resolveAfter2Seconds();
  // expected output: 'resolved'
  console.log("waiting for result");
  console.log(result);

  console.log("send array");
}

asyncCall();

谢谢

【讨论】:

    猜你喜欢
    • 2019-06-12
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多