代码之家  ›  专栏  ›  技术社区  ›  Sante Kyaku

为什么我要用等待来获得承诺的结果?

  •  0
  • Sante Kyaku  · 技术社区  · 2 年前
    const delay = ms => new Promise(res => setTimeout(res, ms));
    
    async function notInstant() {
      await delay(1);
      return 1;
    }
    
    (async function() {
     let a = notInstant();
     console.log(a);
     await delay(10000);
     console.log("Still a promise after 10 seconds even though the function only waits for 1 millisecond =>", a);
     a = await a;
     console.log("Printing directly after but now is resolved with the correct value", a);
    })();
    

    我知道我不应该依赖setTimeout来处理这类事情,但我不明白为什么在10秒后打印结果仍然会给出一个未解决的承诺,即使调用的函数只等待1毫秒才返回值。 然后,出于某种原因,使用await可以使结果直接可用。

    4 回复  |  直到 2 年前
        1
  •  2
  •   StriplingWarrior    2 年前

    此示例说明了您正在遵守的原则:

    let a = {};
    console.log(a);
    a.val = 1;
    console.log(typeof a); // still an object even though `a` has a value
    a = a.val;
    console.log(typeof a); // now it's a number
    

    原始承诺返回自 notInstant 永远是一个承诺。 await 基本上从对您的承诺中提取已解决的价值。唯一的原因 a 在您的示例中,最终成为一个值是您将其设置为 等候 表示

    如果你想设置 当它完成时,它承诺的结果,但避免 等候 你可以用它 then 方法来影响状态更改,如下所示:

    const delay = ms => new Promise(res => setTimeout(res, ms));
    
    async function notInstant() {
      await delay(1);
      return 1;
    }
    
    (async function() {
     let a = notInstant();
     console.log(a);
     a.then(n => a = n);
     await delay(1000); 
     console.log("a has its value now; we waited long enough", a);
    })();
    

    这可能不是一个很好的遵循模式(重用变量来表示承诺和价值),但希望它有助于教授原则。

        2
  •  1
  •   Ofer Skulsky    2 年前

    从文档中:

    等待表达式导致异步函数执行暂停,直到 承诺已解决(即履行或拒绝),并恢复 完成后执行异步函数。恢复时 等待表达的价值是履行承诺的价值。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

    因此,正如DaveG所提到的,没有发出等待的声音,你只是在履行诺言

        3
  •  0
  •   Rocky    2 年前

    请注意 async functions 回报承诺。
    你需要 await 获得承诺的价值。


    这是什么 MDN 关于它:

    Async Function's Return value

    A. Promise 将使用异步函数返回的值来解析,或使用从异步函数引发的异常或在异步函数中未捕获的异常来拒绝。

        4
  •  0
  •   Omar Ben Brahim    2 年前

    使用await function()时, 函数应返回承诺, 如果你把wait放进去,那么这个函数返回的结果不是promise 等待没有任何效果。 因此,您需要告诉js等待结果,并承诺在两种情况下您将返回解决或拒绝。 check MDN Documention