如何按顺序运行两行Javascript-异步/承诺/回调

问题描述

我需要在香草javascript中按顺序运行两行(或更多行)代码

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

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

假设fSubProcedure1()的代码如下(对于此示例):

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

这实际上是与这里how to run sequence functions in javascript相同的问题,尽管那里提供的答案并未显示如何做到这一点,并且自那以来,有关promise和异步函数的语法已有更新。

这几天的答案似乎是promise and async / await ...还是只是不使用promise的回调?

我已经阅读了很多关于诺言的描述和教程,包括此处。

但是,我最终得到这样的代码

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

如您所见,它不必要地增加了400%的行,但仍无法可靠地工作。

有没有更有效的方式来编写此代码,或更合适的方式?

(要求是在fSubProcedure2(及其任何子进程)完全完成之后运行fSubProcedure1。我正在尝试从“这不是JS的工作方式”转变为“这就是方法使JS达到该要求”。

我试图获得很好的理解,以便将其应用于整个项目方法-每个示例中都有很多示例。

解决方法

如果selector: app: server-demo 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);中为每个fMasterProcedure捕获错误

资源:

async function

async await

查看这些资源以了解更多信息