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

Posted

技术标签:

【中文标题】使用 Async/Await 控制哪些代码停止【英文标题】:Control Which Code Stops with Async/Await 【发布时间】:2017-05-19 11:04:15 【问题描述】:

您可以使用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

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

有没有更好的解决方案?如果没有,我可以做些什么来减少耗时?

【问题讨论】:

把这个应用到每一个函数上会完成什么?一些背景或示例可能会有所帮助。 不是每一个函数。我说过要控制它停止的内容,而不是将其应用于所有功能。 您不能在未设置为async 的函数中使用await - 所以anotherFunction 无效 @JaromandaX 哦,是的,忘记了。固定! 你想用这个实现什么?如果您想按顺序运行 Promise,您可以在 bluebird 中使用 reduce 函数,或者如果您更喜欢 vanilla javascript,请使用以下方法:***.com/a/36672042/177006 【参考方案1】:

我认为你对 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 函数,如果你更喜欢 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 之前,promise 不会被解析,并且不会在控制台中记录任何内容。请注意,waitForUserInput 不会停止 Javascript 引擎。引擎将继续执行任何其他代码并响应 UI 事件。

【讨论】:

我知道它是如何工作的,但我正在查看您的最后一行。 “引擎将继续执行任何其他代码并响应 UI 事件。”我想控制这个代码是否运行,或者那个代码运行,或者什么。 @MasterBob 你可以通过 await 做到这一点,但你不能完全暂停 Javascript 引擎。是不可能的!请花点时间阅读这篇文章:developer.mozilla.org/en/docs/Web/JavaScript/EventLoop 另外,看看这个答案:***.com/a/2734311/177006 我想那是不可能的,我将不得不使用我的解决方案。这让我很担心,因为现在即使是常规功能也无法在不支持 async/await 的浏览器上运行。 @MasterBob:如果您使用Babel 将代码转译为 ES5,则所有async / await 都将转换为 Promises 并适用于所有浏览器。看看这个:babeljs.io/repl/… @MasterBob 我怀疑您的想法存在结构性问题。使用特定用例创建一个新问题,并要求一个结构化的答案。如果架构正确,可以肯定使用 Javascript 可以实现您想要做的事情!

以上是关于使用 Async/Await 控制哪些代码停止的主要内容,如果未能解决你的问题,请参考以下文章

当使用带有promise和appendChild的async / await时,应用程序停止工作

C# Async Await 注意事项

停止像这样使用 “async/await“,改用原版

node.js异步控制流程 回调,事件,promise和async/await

使用 es7 async/await 检查 mongodb 中是不是存在文档

我们需要在控制器中使用 async/await 关键字吗?