2016-09-24 5 views
1

次のタスクを実行するWebアプリケーションがあります。選択した日付範囲では、範囲内の日付ごとにWebサービスにGETリクエストを行います。これはしばらく時間がかかります。後でデータを視覚化したいので、すべての呼び出しは同期しています(各要求の結果が配列に格納されます)。この検索には時間がかかります(数秒)。これは、メインスレッドが「フリーズ」していることを意味します。jQuery:別のスレッドでデータを取得する

これを避けるにはどうすればよいでしょうか? (別のスレッドで検索を行い、完了したら通知を受け取るなど)

答えて

2

promisesを使用することを検討してください。 これにより、APIへの非ブロッキング呼び出しを実行できます。それは基本的にあなたが求めているものです。

編集:when()を使用して、すべての操作が完了したときに通知することができます。

+0

これは有望そうです。私はそれを徹底的に調べます。 :-) – blazs

1

GET要求を非同期にして、すべての要求が完了したら視覚化する必要があります。

var get1 = $get(.. 
var get2 = $get(.. 
var get3 = $get(.. 

$.when(get1, get2, get3).done(function (...) { 
    // do something with the response 
    visualize(); 
}); 
+0

興味深い:私の場合、GET要求の数は実際にGET要求(日付範囲を返す)に依存します。 – blazs

1

実際には単純な解決策があります。さんは、すべての応答が到着したときに実行する必要のあるfunctionを実装してみましょう:今すぐ

function onFinished(responses) { 
    //Do something 
} 

、あなたは配列として日付を返すfunctionを持っていると仮定してみましょう:

function getDates(range) { 
    //Do something 
} 

はまた、我々はgetURLを必要とし、

function getURL(date) { 
    //Do something 
} 

最後に、あなたが持っているdateRangeという変数があるとしましょう。このようなあなたはgetDatesの入力として使用します。だから我々はこれを行うことができます:

var requestDates = getDates(dateRange); 
var requestsPending = requestDates.length; 
var responses = []; 
for (var requestIndex in requestDates) { 
    $.ajax({ 
     url: getURL(requestDates[requestIndex]), 
     method: "GET", 
     //You might pass data as well here if needed in the form of 
     //data: yourobject, 
    }).done(function(data, textStatus, jqXHR) { 
     //Handle response, parse it and store the result using responses.push() 
    }).fail(function(jqXHR, textStatus, errorThrown) { 
     //Handle failed requests 
    }).always(function(param1, param2, param3) { 
     if (--requestsPending === 0) { 
      onFinished(responses); 
     } 
    }); 
} 

これはあなたが必要とする各日付のAJAX要求を送信し、非同期的にそれらの応答を待って、そう、あなたが効果的に保留中の時間の合計を待ちますが、最長のために保留していないだろう時間、これは最適な最適化です。 Javascriptはシングルスレッドなので、マルチスレッドでこの問題を解決することは不可能です。したがって、要求がサーバー上で互いを待たずに応答を非同期に待つ必要があります。サーバーを所有している場合は、日付ごとにリクエストを送信する必要はなく、日付範囲を処理するサーバー側API関数を実装する必要があります。そのため、クライアント側は単一のリクエストを送信し、回答。

関連する問題