我只想了解 Promises 和等待的工作方式。
我希望通过按该顺序记录1, 2, 3
来解决此问题。 目前它会记录1, 3, 2
。
我知道 Promise 在这里确实没有用,但在我的程序中它有其他用途,所以需要留下来。从Caller
函数到Test
的路径也需要保留(如果需要,您可以更改这些但只是知道它们在那里是有原因的)
我的问题是如何等待Caller
功能解决?
function Test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('2');
resolve();
}, 2000);
})
}
function Caller() {
Test();
}
console.log('1');
Caller();
console.log('3');

我已经尝试了我所理解的,即使Caller()函数等待Test Promise,但这当然使得Caller()函数异步,因此我们仍然得到1,3,2
async function Caller() {
await Test();
}
是否有一些方法可以在不使函数异步的情况下使用await?
答案 0 :(得分:5)
await
一个返回一个承诺的函数(嗯,不完全正确,如果它没有返回一个承诺,它会创建一个立即解析的承诺)await
function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('2');
resolve();
}, 2000);
})
}
async function caller() {
console.log('1');
await test();
console.log('3 (this is blocked awaiting the promise');
}
caller()
console.log("This is not blocked because caller is async");
答案 1 :(得分:1)
这是一种非常直接,简单的方式来做你所要求的。
self.viewControllers
关键字只能在函数内部使用 用await
定义。
async

这是Google发表的一篇很好的文章,主题是: Async functions - making promises friendly
引用source。
答案 2 :(得分:0)
以下是如何使用这样的函数:
function sleep(ms) {
return new Promise(r => {
setTimeout(() => r(), ms);
});
}
(async () => {
console.log(1);
await sleep(1000); // 1s
console.log(2);
await sleep(2000) // 2s
console.log(3)
})();

答案 3 :(得分:-1)
以前的答案都是正确的,但我觉得这个答案更有意义。它对原始问题的代码更准确:
function Test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('2');
resolve();
}, 2000);
})
}
function Caller() {
return Test();
}
(async() => {
console.log('1');
await Caller();
console.log('3');
})();