Angular6で非同期関数を待機しています

ヨハンC。

Angular 6プロジェクトでいくつかの提案と、ベストプラクティスのヒントが必要です。

以下にいくつかの擬似コードを示します(タイプミスは無視してください)が、基本的にはそれが起こっていることです。プロジェクトは、ユーザーに表示する前に、新しい新しいデータを取得して処理するために、いくつかの手順を実行します。私がやりたいのは、それが完了するまですべてのステップ1を実行し、次にステップ2に進み、完了するとステップ3に進むということです。これは、一部のステップでは、要求を行う前に前のステップからの応答が必要なためです。つまり、各ステップが終了するのを待ってから、次のステップに進む必要があります。しかし、非同期関数には少し問題があります。

var token;

mainFunction(){
    step1();
    console.log("Done with step 1");

    step2();
    console.log("Done with step 2");

    step3();
    console.log("Done with step 3");
}

step1(){
    console.log("Step 1...");
    var data1 = getData();
    // Does things with data1
}

step2(){
    console.log("Step 2...");
    var data2 = getData();
    // Does things with data2
}

step3() {
    console.log("Step 3...");
    var data3 = getData();
    // Does things with data3
}

async getData(){
    await getAccessToken();

    var result;

    console.log("Getting data...");

    // Makes a request to an API.
    this.http.post("URL", token)
    .map(response => response.json())
    .toPromise()
    .then((response: any) => {
        console.log("Got the data!");

        // Processing the response
        result = response;
    }
    return result;
}

async getAccessToken(){
    console.log("Getting access token...");

    let accessToken = await getToken(); //Returns a Promise

    this.token = accessToken;
    console.log("Got the token!");

    return Promise.resolve(true);
}

問題は、getAccessToken関数内のgetToken()から始まりました。これはpromiseを返す非同期関数です。つまり、応答を待ちません。問題ありません。しばらくお待ちください。問題なく動作します。

ただし、getAccessToken()がgetToken()の終了を待機している場合でも、getData()はgetAccessToken()がgetToken()の待機を終了するのを待機しません。解決?Promiseを返し、getData()内で待機しました。しかし、私はそれを動かしただけで問題を解決しませんでした。

現在、getData()は、リクエストを実行する前にaccessTokenが終了するのを待機していますが、step1、step2、およびstep3は待機していません。ずっと約束を返し、すべての関数を待つという解決策はありますか?私はそれを行うためのよりクリーンな方法があり、実際に待つ必要がある場所を待つだけで、すべてが停止し、それが完了するのを待つことを願っています。

それを行うためのクリーンな方法はありますか?ベストプラクティスは何ですか?

これは私が望む出力です:

  • ステップ1...
  • アクセストークンを取得しています...
  • トークンを手に入れました!
  • データの取得...
  • データを手に入れました!
  • 手順1で完了
  • ステップ2...
  • アクセストークンを取得しています...
  • トークンを手に入れました!
  • データの取得...
  • データを手に入れました!
  • ステップ2で完了
  • ステップ3 ...
  • アクセストークンを取得しています...
  • トークンを手に入れました!
  • データの取得...
  • データを手に入れました!
  • 手順3で完了

これは私が得る出力です:

  • ステップ1...
  • アクセストークンを取得しています...
  • 手順1で完了
  • ステップ2...
  • アクセストークンを取得しています...
  • ステップ2で完了
  • ステップ3 ...
  • アクセストークンを取得しています...
  • 手順3で完了
  • トークンを手に入れました!
  • データの取得...
  • データを手に入れました!
  • トークンを手に入れました!
  • データの取得...
  • データを手に入れました!
  • トークンを手に入れました!
  • データの取得...
  • データを手に入れました!
TJクラウダー

ずっと約束を返し、すべての関数を待つという解決策はありますか?

はい(ただし、あなたがそれを行う必要はありませんのでご注意明示的にあなたが持っているようにgetAccessToken、より下の、)。関数が非同期関数の結果に依存している場合、その関数も非同期である必要があります。これはずっと泡立ちます。

必要に応じてmainFunction処理するstep1step2step3順番に、彼らは、非同期の結果に依存し、それらは非同期でなければならない、とmainFunction非同期でなければなりません(と、それを使って何が非同期でなければなりません):

async function mainFunction() {
    console.log("mainFunction start");
    await step1();
    console.log("step1 done");
    await step2();
    console.log("step2 done");
    await step3();
    console.log("step3 done");
    console.log("mainFunction done");
}
async function step1() {
    await getData();
}
async function step2() {
    await getData();
}
async function step3() {
    await getData();
}
async function getData() {
    await getAccessToken();
    return Math.floor(Math.random() * 1000);
}
async function getAccessToken() {
    await asyncStandIn();
}
function asyncStandIn() {
    return new Promise(resolve => setTimeout(resolve, 800));
}

// Top level entry
(async () => {
    mainFunction();
})().catch(error => {
    console.error(error);
});

Re getAccessTokenasyncあなたが持っているようにそれを関数にするだけで、それは常に約束を返すことを意味します。必要はありませんreturn Promise.resolve(true);。その行を削除するだけです。(ただし、呼び出された関数getAccessTokenがアクセストークンを返さないのは少し奇妙です。)

もっと読む; 私の考えでは、次の重複として質問を閉じることに投票することは正しいことではありませんが、他の人は異なる可能性があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

promise内で非同期関数を待機しています

分類Dev

forループで非同期関数を待機しています

分類Dev

非同期関数は待機しないで待機します

分類Dev

待機を待機していない非同期関数

分類Dev

ノードJは非同期関数内で機能しないのを待っています

分類Dev

Javascript非同期関数が待機せずに応答を待機しています

分類Dev

非同期関数を再帰的に呼び出す関数を待機しています

分類Dev

Chrome拡張機能-sendResponseは非同期関数を待機していません

分類Dev

NodeJSで非同期メソッドを待機しています

分類Dev

Promiseを待機していない非同期関数

分類Dev

Python asyncioを使用して、同期関数から非同期関数を実行して待機します

分類Dev

非同期プログラミング:非同期ではない関数内で待機します

分類Dev

非同期/待機関数を並行して呼び出す

分類Dev

連鎖した続編関数からの非同期応答を待機しています

分類Dev

JavaScriptはifステートメントで非同期関数を待機します

分類Dev

JavaScriptはifステートメントで非同期関数を待機します

分類Dev

JavaScriptはwhileループで非同期関数を待機します

分類Dev

JavascriptのJQuery $ .each内の非同期ネスト関数からのデータを待機しています

分類Dev

非同期関数呼び出しが完了するのを待っています

分類Dev

List <T>に要素を追加している間、非同期で待機します

分類Dev

AndroidのIntentServiceで非同期コールバックを待機しています

分類Dev

テストされた関数内で非同期関数を待機しているジャスミン

分類Dev

2つの非同期タスクを待機しています

分類Dev

forEachループ内で待機していない非同期関数

分類Dev

関数pushが機能しない状態で非同期/待機

分類Dev

関数でのエラー待機にはすでに非同期が含まれています

分類Dev

関数を待機していない非同期メソッド-VUE

分類Dev

javascriptは複数の連鎖非同期関数で待機します

分類Dev

非非同期から非同期/待機関数を呼び出し、付加価値が未定義を返します

Related 関連記事

  1. 1

    promise内で非同期関数を待機しています

  2. 2

    forループで非同期関数を待機しています

  3. 3

    非同期関数は待機しないで待機します

  4. 4

    待機を待機していない非同期関数

  5. 5

    ノードJは非同期関数内で機能しないのを待っています

  6. 6

    Javascript非同期関数が待機せずに応答を待機しています

  7. 7

    非同期関数を再帰的に呼び出す関数を待機しています

  8. 8

    Chrome拡張機能-sendResponseは非同期関数を待機していません

  9. 9

    NodeJSで非同期メソッドを待機しています

  10. 10

    Promiseを待機していない非同期関数

  11. 11

    Python asyncioを使用して、同期関数から非同期関数を実行して待機します

  12. 12

    非同期プログラミング:非同期ではない関数内で待機します

  13. 13

    非同期/待機関数を並行して呼び出す

  14. 14

    連鎖した続編関数からの非同期応答を待機しています

  15. 15

    JavaScriptはifステートメントで非同期関数を待機します

  16. 16

    JavaScriptはifステートメントで非同期関数を待機します

  17. 17

    JavaScriptはwhileループで非同期関数を待機します

  18. 18

    JavascriptのJQuery $ .each内の非同期ネスト関数からのデータを待機しています

  19. 19

    非同期関数呼び出しが完了するのを待っています

  20. 20

    List <T>に要素を追加している間、非同期で待機します

  21. 21

    AndroidのIntentServiceで非同期コールバックを待機しています

  22. 22

    テストされた関数内で非同期関数を待機しているジャスミン

  23. 23

    2つの非同期タスクを待機しています

  24. 24

    forEachループ内で待機していない非同期関数

  25. 25

    関数pushが機能しない状態で非同期/待機

  26. 26

    関数でのエラー待機にはすでに非同期が含まれています

  27. 27

    関数を待機していない非同期メソッド-VUE

  28. 28

    javascriptは複数の連鎖非同期関数で待機します

  29. 29

    非非同期から非同期/待機関数を呼び出し、付加価値が未定義を返します

ホットタグ

アーカイブ