Javascript 如何在ES7中等待以前启动的功能?

Javascript 如何在ES7中等待以前启动的功能?,javascript,asynchronous,ecmascript-2016,Javascript,Asynchronous,Ecmascript 2016,我有两个异步方法返回值,根据第一个结果,其中一个立即需要,另一个可能正在使用。但是,我不想在启动第二个方法并创建执行序列依赖项之前等待第一个结果 使用ES7语法,我假设await-ing一个Promise与await-ing一个返回Promise的函数相同,但它不起作用: async function tester() { async function foo() { await setTimeout(() => {}, 2000)} async function bar(

我有两个异步方法返回值,根据第一个结果,其中一个立即需要,另一个可能正在使用。但是,我不想在启动第二个方法并创建执行序列依赖项之前等待第一个结果

使用ES7语法,我假设
await
-ing一个
Promise
await
-ing一个返回
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
    }
}
await rcFoo;
console.log(rcFoo); // It's a Promise object
两个问题:

  • 我是否正确理解了Javascript的异步本质?如果上面的代码能够工作,那么它是否已经实现了我并发运行两个异步函数的目标,或者根本不可能做到这一点
  • 是否可以像我尝试过的那样,以某种方式
    等待
    一个
    承诺的对象,或者它必须直接引用一个函数
  • 谢谢

  • 在您的代码中,
    foo
    将立即启动,然后
    bar
    将启动。即使
    foo
    首先完成,您的代码仍在等待
    承诺在继续之前完成
  • 您可以等待一切,只要它是一个承诺,无论它是变量还是函数调用返回的值。据我所知(我可能错了),setTimeout不会返回承诺,但很容易将其转换为承诺:

    async function foo() {
      return new Promise(resolve => setTimeout(resolve, 2000))
    }
    async function bar() {
      return new Promise(resolve => setTimeout(resolve, 1000))
    }
    
  • 我假设
    await
    -ing承诺与
    await
    -ing返回承诺的函数相同

    与等待返回承诺的函数调用的结果相同,yes(正在等待承诺)

    但它不起作用:

    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
        }
    }
    
    await rcFoo;
    console.log(rcFoo); // It's a Promise object
    
    它确实有效,只有等待变量不会改变该变量。您只能
    await
    值,承诺的结果将成为
    await
    表达式的结果值:

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


    这就是说,
    setTimeout
    不会返回承诺,因此您的代码不会休眠三秒。你必须做出承诺,就像@PedroMSilva展示的那样。

    你应该能够
    等待
    a
    Promise
    ,因为
    async
    函数只是创建
    Promise
    的糖分。但是,您不能在
    async
    函数之外使用
    wait
    ,因此这可能就是您的问题所在。这段代码已经在
    async
    函数中。这可能是,但您的示例没有显示这一点,所以我不知道:-)wait setTimeout将等待发出
    setTimeout
    ,这将立即发生,而不是触发超时。正确,
    setTimeout
    不会返回承诺,而是一个标识超时的不透明对象。可以将此对象传递到
    clearTimeout
    ,以在超时过期之前取消超时。