控制以 Async/Await 结尾的代码
Control Which Code Stops with Async/Await
您可以使用 await
停止 async
函数之外的代码吗?但是,我不希望所有代码都停止。我想控制什么代码会 运行.
我认为可能有解决方案,如下所示:
var isAsyncRunning = false;
var currentPromise;
async function asyncFunc(){
isAsyncRunning = true;
//Do some code here
currentPromise = promise; //promise was defined inside the code
await promise;
promise.then(function(){
isAsyncRunning = false;
});
}
async function anotherFunction(){
if(!isAsyncRunning){
await currentPromise;
}
//Do some other code here
}
但是,我有很多功能,不想将其应用到我拥有的每个功能。
有更好的解决办法吗?如果没有,我能做些什么来减少耗时吗?
我认为您对 Promises 和 async/await
的理解不正确。当你创建函数 async
时,promise 前的 await
关键字确保代码执行将暂停,直到 promise 实现或被拒绝。您的代码可以简化:
var currentPromise;
async function asyncFunc(promise){
// Do some code here
return await promise;
}
function anotherFunction(){
asyncFunc(currentPromise);
}
当我们调用 return await promise
时,执行引擎以非阻塞的方式等待,直到承诺完成或被拒绝,然后它 returns 输出到 anotherFunction
函数.
注意:如果你想运行按顺序承诺你可以在bluebird
或这个[=24中使用reduce
函数=],如果你喜欢香草 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()
在此示例中,在按下 keyCode
之前不会解决承诺,并且不会将任何内容记录到控制台中。请注意,waitForUserInput
不会停止 Javascript 引擎。引擎将继续执行任何其他代码并响应 UI 事件。
您可以使用 await
停止 async
函数之外的代码吗?但是,我不希望所有代码都停止。我想控制什么代码会 运行.
我认为可能有解决方案,如下所示:
var isAsyncRunning = false;
var currentPromise;
async function asyncFunc(){
isAsyncRunning = true;
//Do some code here
currentPromise = promise; //promise was defined inside the code
await promise;
promise.then(function(){
isAsyncRunning = false;
});
}
async function anotherFunction(){
if(!isAsyncRunning){
await currentPromise;
}
//Do some other code here
}
但是,我有很多功能,不想将其应用到我拥有的每个功能。
有更好的解决办法吗?如果没有,我能做些什么来减少耗时吗?
我认为您对 Promises 和 async/await
的理解不正确。当你创建函数 async
时,promise 前的 await
关键字确保代码执行将暂停,直到 promise 实现或被拒绝。您的代码可以简化:
var currentPromise;
async function asyncFunc(promise){
// Do some code here
return await promise;
}
function anotherFunction(){
asyncFunc(currentPromise);
}
当我们调用 return await promise
时,执行引擎以非阻塞的方式等待,直到承诺完成或被拒绝,然后它 returns 输出到 anotherFunction
函数.
注意:如果你想运行按顺序承诺你可以在bluebird
或这个[=24中使用reduce
函数=],如果你喜欢香草 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()
在此示例中,在按下 keyCode
之前不会解决承诺,并且不会将任何内容记录到控制台中。请注意,waitForUserInput
不会停止 Javascript 引擎。引擎将继续执行任何其他代码并响应 UI 事件。