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

时间:2017-01-05 01:31:01

标签: 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
}

但是,我有很多功能,并且不想将其应用于我拥有的每个功能

有更好的解决方案吗?如果没有,我有什么办法可以减少耗时吗?

1 个答案:

答案 0 :(得分:4)

我认为你对Promises和async/await的理解是不正确的。当您创建函数async时,承诺之前的await关键字确保代码执行将暂停,直到承诺完成或被拒绝。您的代码可以简化:

var currentPromise;

async function asyncFunc(promise){
    // Do some code here
    return await promise;
}

function anotherFunction(){
    asyncFunc(currentPromise);
}

当我们调用return await promise时,执行引擎以非阻塞方式等待,直到promise被完成或拒绝,然后它将输出返回到anotherFunction函数。

注意:如果您想在序列中运行promises,可以使用reducemethod中的bluebird函数,如果您更喜欢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()

在此示例中,在按下keyCode之前不会解析承诺,并且不会将任何内容记录到控制台中。请注意,waitForUserInput不会停止Javascript引擎。引擎将继续执行任何其他代码并响应UI事件。