0

私はこのようなことをしています

$.getJSON(url1, function(response1){
if(response1.status == 'success'){
    $.getJSON(url2, function(response2){
        if(response2.status == 'success') {
            $.getJSON(url3, function(response3){
                if(response3.status == 'success') {
                    //final code here
                }
            });
        }
    });
}
});

https://github.com/caolan/async#seriesのような非同期ライブラリについて聞いたことがあり ます。この状態でこれを実装するにはどうすればよいですか?

4

2 に答える 2

1

コードは既に非同期処理モデルを使用しています。したがって、非同期にするために他のライブラリを使用する必要はありません。

$.getJsonは、 $ .ajax を使用してサーバーからデータを送受信するユーティリティ メソッドです。$.ajax は XmlHttpRequest を使用して、非同期処理モデルを使用して構築されたデータを送受信します。

必要に応じて非同期の性質をテストするには、 $.getJson() 呼び出しの後に console.log('after post') を追加し、 if(response2.status == 'success の前に console.log('after callback') を追加します') ステートメント。

after postリクエストを送信した後にコンソールを確認すると、前に が表示されていることがわかりafter callbackます。これは、サーバーからの応答を待たずにスクリプトの実行が続行されたことを意味します。

于 2013-02-24T05:50:29.060 に答える
1

本当に同期呼び出しを行いたいですか (完了するまでブラウザーをブロックしgetJSONます)、それとも、(コールバックでネストせずに) 次々に開始する "よりクリーンな" 方法が必要ですか? 他の人がすでに指摘したように、ajax 呼び出しは既に互いに同期しています。

最初のオプションについては、より一般的なものを見てください(引数でに$.ajax設定できます)。2 つ目は、再帰的なユーティリティ関数を作成するだけです。asyncfalse

function chain(list,index,callback,errorCallback) {
    if ( index == list.length )
        return callback();
    $.getJSON(list[index])
        .done(function() {
            chain(list,index+1,callback);
        })
        .fail(errorCallback);
}
chain([url1, url2, url3],0,function() {
    //final code here
},function() {
    //error handling here (in any of the calls)
});
于 2013-02-24T05:52:04.047 に答える