web-dev-qa-db-ja.com

Angular / TypeScript-別の関数が完了した後に関数を呼び出す

f2f1が完了しました。 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...
}

問題は、プログラムが常に待機する必要があることです1500msf2前に開始f1は終了しました。多かれ少なかれ、必要な時間を待つ方法はありますか?

9
veben

したがって、setTimeout部分を削除します。 resolveまたはrejectを呼び出し、次のthenまたはcatchハンドラーに実行を渡します。 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());
7
Suren Srapyan

f1synchronousの場合、特別なことは何もありません。

global() {
    f1();
    f2();
}

f1asynchronousであり、Observableを返す場合、Rxjs operatorを使用します。 concatMap

global() {
    f1().concatMap(() => f2());
}

f1asynchronousPromiseを返す場合、async/awaitを使用します。

async global() {
    await f1();
    f2();
}

f1asynchronousであり、Promise(代替)を返す場合:

global() {
    f1().then(res => f2());
}
3
veben

タイムアウトを削除するだけです

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

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

f1().then(f2);
0
S. Stumm