async/await 函数不等待。多个功能不按顺序运行和完成

Posted

技术标签:

【中文标题】async/await 函数不等待。多个功能不按顺序运行和完成【英文标题】:async/await functions not waiting. Multiple functions don't run and finish in order 【发布时间】:2017-09-11 07:32:50 【问题描述】:

我正在尝试编写“现代”js,并通过使用 async/await 来避免回调和承诺。但是,我不能完全理解它是如何工作的。我认为“下一个”功能会等到第一个功能完成后再运行。

在我的应用程序中,这四个函数都是对 mysql DB 的 ajax 调用,以更新记录并选择其他数据并构建要写入 DOM 的新 html 表。

这四个函数是按顺序完成的,导致界面不正确。刷新整个页面可以解决问题,但如果函数能够按照我定义的顺序运行和完成,那么界面就是正确的。

async function reloadAllTable(workOrderId,statusId) 
    await techSelectTable(workOrderId);
    await updateWOStatus(workOrderId,statusId);
    await loadWOScheduled(statusId);
    await loadWOAssigned(statusId);


reloadAllTable(workOrderId,statusId);

【问题讨论】:

你在等待一个承诺。这些函数中的任何一个都返回承诺吗?如果没有,那是你的问题。 没有。它们都是处理数据库记录的ajax例程,但这些过程必须按顺序发生。 你如何期望 JS 知道他们什么时候完成?例如是否techSelectTable 完成后通常会调用传入的回调什么的? 【参考方案1】:

我刚发现这个问题,但对于发现这个问题的其他人来说,迟到总比没有好。

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Statements/async_function

async 函数可以包含一个 await 表达式,它暂停 async 函数的执行并等待传递的 Promise 的解析,然后恢复 async 函数的执行并返回解析的值。

您的问题可能是要使用 async/await 语法,被调用的函数必须返回一个承诺。如果没有承诺等待解决,则继续执行下一条语句。正如您在上面所说,这些函数不会返回承诺,因此不会以所需的顺序加载。

要按照您指定的顺序执行代码,您需要修改函数以返回一个承诺。如果 AJAX 调用返回一个 thenable,您可以将其转换为一个 Promise,并等待该 Promise:

Promise.resolve( yourThenable )

对于遵循节点回调样式的函数,一种方法是通过 promisify-node 模块 (https://www.npmjs.com/package/promisify-node):

var promisify = require("promisify-node");

function myCallbackFunction(callback) 
  callback(null, true);


// Convert the function to return a Promise. 
var wrap = promisify(myCallbackFunction);

// Invoke the newly wrapped function. 
wrap().then(function(value) 
console.log(value === true);
);

【讨论】:

以上是关于async/await 函数不等待。多个功能不按顺序运行和完成的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 等待 axios+nedb 函数 async/await 运行下一个查询

调试 .NET Async/Await 函数时无法检查变量

JavaScript async/await 没有正确等待?

Async Await使用场景

Async Await使用场景

Async Await使用场景