javascript - 使用 Async/Await 控制哪些代码停止

标签 javascript asynchronous promise async-await ecmascript-2017

您可以使用 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 时,执行引擎以非阻塞方式等待,直到 promise 完成或被拒绝,然后将输出返回给 anotherFunction 功能。

注意:如果您想按顺序运行 promise ,您可以使用 bluebird 或此 method 中的 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 之前,promise 不会被解析,并且控制台中不会记录任何内容。请注意,waitForUserInput 不会停止 Javascript 引擎。引擎将继续执行任何其他代码并响应 UI 事件。

关于javascript - 使用 Async/Await 控制哪些代码停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41475970/

相关文章:

javascript - 使用 Bluebird 进行异步 Promise 处理

c# - 异步在 ASP.NET Web 应用程序中如何工作?

javascript - 使用 Mongoose 创建对象之前检查唯一字段

javascript - 将错误消息附加到 Protractor 单击?

javascript - 从下拉列表中更改值

javascript - Lodash默认递归父级检查

javascript - 使用 emberjs,如何从父 View 扩展 attributeBindings 参数?

javascript - 从 javascript 函数返回一个值,然后执行其中的代码

javascript - Android 喜欢状态栏吗?

javascript - Nodejs for 循环更改为同步