如何等待 ES7 中先前启动的功能?

How to await a previously-started function in ES7?

我有两个异步方法 return 值,其中一个是立即需要的,另一个可能正在使用,基于第一个结果。但是,我不想等到第一个结果出现后再开始第二个方法并创建执行顺序依赖性。

使用 ES7 语法,我会假设 await-ing a Promiseawait-ing 函数相同 returns a Promise, 但它不起作用:

async function tester() {
    async function foo() { await setTimeout(() => {}, 2000)}
    async function bar() { await setTimeout(() => {}, 1000)}
    let rcFoo = foo();
    let rcBar = await bar();
    if (true) { // Some conditional based on rcBar
        await rcFoo;
        console.log(rcFoo); // It's a Promise object
    }
}

两个问题:

  1. 我是否正确理解了 Javascript 的异步性质?如果上面的代码可行,它会实现我的目标 运行 两个异步函数并发的目标吗?还是根本不可能做到?
  2. 是否可以像我尝试的那样以某种方式 await 一个 Promise 的对象,或者它是否必须直接引用一个函数?

谢谢..

  1. 在您的代码中,foo 将立即开始,然后 bar 将开始。即使 foo 先完成,您的代码仍会等待 bar 承诺在继续之前完成。
  2. 只要是承诺,您就可以等待所有内容,无论它是变量还是来自函数调用的 returned 值。据我所知(我可能错了),setTimeout 不是 return 承诺,但很容易将其转换为一个:

    async function foo() {
      return new Promise(resolve => setTimeout(resolve, 2000))
    }
    async function bar() {
      return new Promise(resolve => setTimeout(resolve, 1000))
    }
    

I would assume that await-ing a Promise would be the same as await-ing a function that returns a Promise

与等待调用函数的结果相同,return是一个承诺,是的(正在等待一个承诺)。

but it doesn't work:

await rcFoo;
console.log(rcFoo); // It's a Promise object

它确实有效,只是 await 一个变量不会改变那个变量。只能await个值,promise的结果会成为await表达式的结果值:

let res = await promise;
console.log(res); // a value
console.log(promise) // a promise for the value

也就是说,setTimeout 没有 return 承诺,因此您的代码不会休眠三秒钟。你将不得不承诺它,例如@PedroMSilva 展示了它。