0

質問:
新しい非同期関数を開始する非同期関数を待つことはできますか?

詳細:
コードを続行する前、または特定の関数またはコード ブロックを実行する前に、非同期関数が終了するのを待つ方法をいくつか調べました。しかし、非常に長い間私を悩ませていたことが 1 つあります。開始された新しい非同期関数も待機しているのか、それとも独自のコードを考慮する必要があるのか​​ わかりません。

擬似コード:

var value = 1;
af1();
alert(value);

async function af1(){
    af2();
}

async function af2(){
    af3();
}

async function af3(){
    value = 2;
}

これが良い例 (または正しい構文) であるかどうかはわかりませんが、非同期関数を、完了するまでに時間がかかる ajax 要求として考えてください。af1 に延期された jQuery を追加すると、af1 のみを待機し、af2 と af3 を無視するようになると思います。一部の関数には外部の JavaScript ファイルも使用していますが、そこで開始される新しい関数を実際に制御することはできません。

繰り返しになりますが、これらすべてを何かにラップして、すべてが完了した後にコードを実行することは可能ですか? それとも、jQuery の deferred 関数と .done 関数について誤解していますか??

4

3 に答える 3

1

いいえ、async関数は呼び出されたときに待機しません。彼らは約束を返すだけです。

関数内では、他の関数から返されたものを含めて、async明示的に約束できます。awaitasync

コードは、次のように戻り値を使用して記述されている必要があります。

(async function() { // neccessary to use await
    value = await af1();
    alert(value);
}());
af1().then(alert); // or just using promise syntax

async function af1(){
    return af2();
}
async function af2(){
    return af3();
}
async function af3(){
    return 2; // or maybe rather something like
    return $.ajax(…);
}

ただし、戻り値は必要ありませんawait。クロージャーアプローチにも使用できます。

(async function() {
    var value = 1;
    await af1();
//  ^^^^^
    alert(value);

    async function af1(){
        await af2();
    }
    async function af2(){
        await af3();
    }
    async function af3(){
        value = 2; // or maybe rather something like
        value = await $.ajax(…);
    }
}())
于 2015-12-01T09:59:54.770 に答える
1

このgit js ASyncを使用してください

使い方

Async は、通常の「機能的な」容疑者 (マップ、リデュース、フィルター、それぞれなど) と、非同期制御フローの一般的なパターン (並列、シリーズ、ウォーターフォールなど) を含む約 20 の関数を提供します。これらの関数はすべて、非同期関数の最後の引数として単一のコールバックを提供するという Node.js 規則に従っていることを前提としています。

簡単な例

async.map(['file1','file2','file3'], fs.stat, function(err, results){
    // results is now an array of stats for each file
});

async.filter(['file1','file2','file3'], fs.exists, function(results){
    // results now equals an array of the existing files
});

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

async.series([
    function(){ ... },
    function(){ ... }
]);

利用可能な関数は他にもたくさんあるので、完全なリストについては以下のドキュメントを参照してください。このモジュールは包括的であることを目指しているため、何か不足していると思われる場合は、GitHub の問題を作成してください。

続きを読む

于 2015-12-01T10:00:22.817 に答える
0

上記の例とは別に、以下のコード サンプルを見てください。async と wait の概念がより明確になります。

async function doWork(){
    try {
        const response = await makeRequest('facebook'); //using await will wait until the response returned from the makeRequest function
        //console.log('Response Received' + response );

        const response2 = await makeRequest('google');
        //console.log('Response2 Received' + response2 );
    } catch(err) {
        alert(err);
    }
}

function makeRequest(str){
    //function body that takes time to process, eg: server call
    return "making request to " + str;
}

doWork();
于 2020-01-15T15:01:29.177 に答える