如何按顺序运行两行Javascript-async/progress/callbacks



我需要用普通javascript按顺序运行两行(或更多(代码。

每个函数都调用对例程的调用(也称为顶级函数,其目的是执行过程步骤,而不是计算结果(。这些依次调用多个其他。

function fMasterProcedure() {
fSubProcedure1();
fSubProcedure2();
... etc
}

假设fSubProcedure1((的代码如下(对于本例(:

function fSubProcedure1() {
fSubSubProcedure1_1();  // Normal
fSubSubProcedure1_2();  // Async
fSubSubProcedure1_3();  // Normal
fSubSubProcedure1_4();  // Async
fSubSubProcedure1_5();  // Normal
}

这实际上与这里的问题相同,即如何在javascript中运行序列函数,尽管那里提供的答案并没有说明如何做到这一点,而且在此后的几年里,已经有了关于promise和异步函数的语法更新。

如今,答案似乎是promise和async/await。。。还是只是不使用承诺的回调?

我已经阅读了许多关于promise的描述和教程,包括这里。

然而,我最终得到了这样的代码:

function fMasterProcedure() {
return (new Promise(function(resolve, reject) {
fSubProcedure1();
setTimeout(function () {
resolve();
}, 0);
})).then(function(result) {
fSubProcedure2();
});
}

正如你所看到的,它不必要地增加了400%的行,但仍然不能可靠地工作。

有没有更有效的方法来写这篇文章,或者更合适的方法?

(要求在fSubProcedure1(及其任何子进程(完全完成后运行fSubProcedure2。我正试图从";JS不是这样工作的"至";以下是如何使JS实现该要求"(。

我正在努力获得良好的理解,以便将其应用于整个项目方法中——每个方法中都有很多例子。

如果fSubProcedure1fSubProcedure2是两个异步函数,并且您想一个接一个地执行它们,那么尝试使用以下方法:

async function fMasterProcedure() {
await fSubProcedure1();
await fSubProcedure2()
}
// to execute the fMasterProcedure function
fMasterProcedure().then(console.log).catch(console.error);
//replace console.log and console.error with your appropriate callbacks

示例:

// returns Promise<number>
function fSubProcedure1() {
console.log("runs first");
return Promise.resolve(2*2);
}
// returns void
function fSubProcedureNormal() {
console.log("runs second");
//returns nothing
}
// returns number which gets converted to Promise<number>
async function fSubProcedure2() { 
console.log("runs third");
return 2*4;
}
async function fMasterProcedure() {
let a = await fSubProcedure1();
fSubProcedureNormal();
let b = await fSubProcedure2();
return `${a} : ${b}`;
}
fMasterProcedure().then(console.log).catch(console.error);

有一点很重要。。。对于每个await,您需要尝试捕获fMasterProcedure内部的错误

资源:

异步功能

异步等待

查看这些资源以了解更多

最新更新