我需要用普通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实现该要求"(。
我正在努力获得良好的理解,以便将其应用于整个项目方法中——每个方法中都有很多例子。
如果fSubProcedure1
和fSubProcedure2
是两个异步函数,并且您想一个接一个地执行它们,那么尝试使用以下方法:
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
内部的错误
资源:
异步功能
异步等待
查看这些资源以了解更多