我认为您对 Promises 的理解async/await
并不正确。当你创建一个 functionasync
时,await
promise 之前的关键字确保代码执行将暂停,直到 promise 完成或被拒绝。您的代码可以简化:
var currentPromise;
async function asyncFunc(promise){
// Do some code here
return await promise;
}
function anotherFunction(){
asyncFunc(currentPromise);
}
当我们调用return await promise
时,执行引擎会以非阻塞方式等待,直到 promise 完成或被拒绝,然后将输出返回给anotherFunction
函数。
注意:如果你想按顺序运行 Promise,你可以使用reduce
function inbluebird
或 this method,如果你更喜欢 vanilla javascript。
暂停代码执行
从您对原始问题的最新评论,我了解到您想暂停程序的执行。首先,您需要了解以阻塞方式停止 Javascript 执行是不可能的。Javascript 是一种使用事件循环来处理并发的单线程编程语言。您永远不能停止整个引擎进行操作。否则,程序将冻结。在基于线程的编程语言中,程序员使用线程来实现并发。
但是,在 Javascript 中,您可以使用async / await
. 例如:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
async function main() {
await sleep(1500)
console.log('Hello world with delay!')
}
main()
如果我理解正确,在您的情况下,您希望根据用户输入暂停执行。你可以实现你想要的任何类型的逻辑。例如,下面的程序等待用户RETURN
按键:
function waitForUserInput(keyCode) {
return new Promise(resolve =>
document.addEventListener('keydown', (event) => {
if (event.keyCode === keyCode) resolve()
}
)
}
async function main() {
await waitForUserInput(13)
console.log('Thank you for your submission!')
}
main()
在这个例子中,promise 直到keyCode
被按下才会被解析,并且不会有任何东西被记录到控制台中。请注意,这waitForUserInput
不会停止 Javascript 引擎。引擎将继续执行任何其他代码并响应 UI 事件。