2

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

使用 ES7 语法,我假设await-ing a与-ing a 返回 a 的函数Promise相同,但它不起作用:awaitPromise

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一样,或者它是否必须直接引用一个函数?

谢谢..

4

2 回答 2

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

    async function foo() {
      return new Promise(resolve => setTimeout(resolve, 2000))
    }
    async function bar() {
      return new Promise(resolve => setTimeout(resolve, 1000))
    }
    
于 2016-01-08T11:23:32.777 回答
0

我会假设-ing 一个 Promise 与-ing 一个返回 Promise 的函数await相同await

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

但它不起作用:

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

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

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

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

于 2016-01-08T14:01:41.570 回答