Angular/TypeScript - 在另一个函数完成后调用一个函数

veb*_*ben 9 asynchronous synchronous promise typescript angular

我想在完成f2后打电话f1.f1函数可以是同步的异步的.我需要一个适用于这两种情况的示例.我找到了一个解决方案,使用一个Promise和一个计时器:

global() {
    this.f1().then(res => {
        this.f2()
    })
}

f1() {
    return new Promise<any>((resolve, reject) => {

        // Some code...

        setTimeout( () => {
            resolve(x);
        }, 1500);
    });
}

f2() {
    // Some code...
}
Run Code Online (Sandbox Code Playgroud)

问题是程序总是要等待1500ms.我不希望f2f1完成之前开始.有没有办法等待所需的时间,而不是更多或更少?

Sur*_*yan 8

因此,删除setTimeout零件。它将调用resolvereject,然后将执行传递给下一个thencatch处理程序。如果Promise中有一些异步调用,则需要调用resolve/reject该调用的结果。

不等待怎么办1500ms-给定的时间实际上是可以调用该函数的最短时间。也许之后2000ms这与JS代码在其中工作的主线程有关。如果主线程没有工作要做,则将执行异步调用的结果。

function f1() {
    return new Promise((resolve, reject) => {
        console.log('f1');
        resolve();
    });
}

function f2() {
   console.log('f2');
}

f1().then(res => f2());
Run Code Online (Sandbox Code Playgroud)


veb*_*ben 8

如果f1synchronous,则没有什么特别的:

global() {
    f1();
    f2();
}
Run Code Online (Sandbox Code Playgroud)

如果f1异步的并返回一个Observable,请使用Rxjs operator,如concatMap

global() {
    f1().concatMap(() => f2());
}
Run Code Online (Sandbox Code Playgroud)

如果f1异步的并返回一个Promise,请使用async/await

async global() {
    await f1();
    f2();
}
Run Code Online (Sandbox Code Playgroud)

如果f1异步的并返回一个Promise(替代):

global() {
    f1().then(res => f2());
}
Run Code Online (Sandbox Code Playgroud)


小智 5

只需删除超时即可

function f1() {
    return new Promise((resolve, reject) => {
        console.log('i am first');
        resolve();
    });
}

function f2() {
    console.log('i am second');
}

f1().then(f2);
Run Code Online (Sandbox Code Playgroud)