Javascript 如何在ES7中等待以前启动的功能?
我有两个异步方法返回值,根据第一个结果,其中一个立即需要,另一个可能正在使用。但是,我不想在启动第二个方法并创建执行序列依赖项之前等待第一个结果 使用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(
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
两个问题:
等待一个承诺的对象,或者它必须直接引用一个函数
foo
将立即启动,然后bar
将启动。即使foo
首先完成,您的代码仍在等待条
承诺在继续之前完成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展示的那样。你应该能够等待aPromise
,因为async
函数只是创建Promise
的糖分。但是,您不能在async
函数之外使用wait
,因此这可能就是您的问题所在。这段代码已经在async
函数中。这可能是,但您的示例没有显示这一点,所以我不知道:-)wait setTimeout将等待发出setTimeout
,这将立即发生,而不是触发超时。正确,setTimeout
不会返回承诺,而是一个标识超时的不透明对象。可以将此对象传递到clearTimeout
,以在超时过期之前取消超时。