Mas*_*Bob 3 javascript asynchronous promise async-await ecmascript-2017
您可以使用 停止async函数之外的代码await吗?但是,我不希望所有代码都停止。我想控制将运行哪些代码。
我认为可能有一个解决方案,如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
但是,我有很多功能,并且不想将其应用于我拥有的每一个功能。
有更好的解决方案吗?如果没有,我能做些什么来减少这种耗时?
我认为你对 Promises 的理解async/await是不正确的。当你创建一个函数时async,awaitpromise 之前的关键字确保代码执行将暂停,直到promise 实现或被拒绝。您的代码可以简化:
var currentPromise;
async function asyncFunc(promise){
// Do some code here
return await promise;
}
function anotherFunction(){
asyncFunc(currentPromise);
}
Run Code Online (Sandbox Code Playgroud)
当我们调用 时return await promise,执行引擎以非阻塞方式等待,直到承诺完成或被拒绝,然后将输出返回给anotherFunction函数。
注意:如果您想按顺序运行承诺,您可以使用reducefunction 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()
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,在您的情况下,您希望根据用户输入暂停执行。您可以实现您想要的任何类型的逻辑。例如,以下程序等待用户按下该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()
Run Code Online (Sandbox Code Playgroud)
在这个例子中,promise 在keyCode被按下之前不会被解析,并且任何东西都不会被记录到控制台中。请注意,这waitForUserInput不会停止 Javascript 引擎。引擎将继续执行任何其他代码并响应 UI 事件。
| 归档时间: |
|
| 查看次数: |
7203 次 |
| 最近记录: |