2013-09-26 6 views

答えて

27

最良の方法は、個別に各いずれかを実行すると、エラー条件を処理することです:

リクエストが並行して起こることを可能にする、できるだけ早く各要求が完了したときにページを更新
$.getJSON(graphicDataUrl) 
    .then(function(data) { 
     // ...worked, put it in #view-graphic 
    }) 
    .fail(function() { 
     // ...didn't work, handle it 
    }); 
$.getJSON(webDataUrl, function(data) { 
    .then(function(data) { 
     // ...worked, put it in #view-web 
    }) 
    .fail(function() { 
     // ...didn't work, handle it 
    }); 

あなたが並行して要求を実行したいが場合、彼らは完全両方、あなたは$.whenであることを行うことができますまで、ページを更新するを待つ:

var graphicData, webData; 
$.when(
    $.getJSON(graphicDataUrl, function(data) { 
     graphicData = data; 
    }), 
    $.getJSON(webDataUrl, function(data) { 
     webData = data; 
    }) 
).then(function() { 
    if (graphicData) { 
     // Worked, put graphicData in #view-graphic 
    } 
    else { 
     // Request for graphic data didn't work, handle it 
    } 
    if (webData) { 
     // Worked, put webData in #view-web 
    } 
    else { 
     // Request for web data didn't work, handle it 
    } 
}); 

を...しかし、ページが見えるかもしれません最初のリクエストが戻ったときに更新していないため応答が遅くなりますが、両方の場合にのみ更新されます。

+0

ありがとう!それはまさに私が探していたものです。私は今それを試してみてください:) –

+0

はだから今私がこれを書いた: '$ .getJSON(graphicDataUrl、機能(データ){ \t $に.get(templateHtml、機能(テンプレート){ \t \tテンプレート= Handlebars.compile(テンプレート) ; \t \t VAR例=テンプレート({作品:データ}); \t \t \t \t viewG.html(例えば); \t}); })。 $ .getJSON(webDataUrl、関数(データ){ \t $に.get(templateHtml、関数(テンプレート){ \t \tテンプレート= Handlebars.compile(テンプレート); \t \t VAR例=テンプレート({動作:データを} ); \t \t \t \t viewW.html(例); \t}); }); '多くのリピートコードがあります。また、私はエラーを処理せずにそれを行うことができますか? (リプレイとしてコードを書き込むには良い方法はない?) –

+0

@GiorgiaSambrotta:もちろん良い方法がある。 :-)それを関数にカプセル化することができます。なぜ、テンプレートを保持して再利用するのではなく、 'templateHtml'からテンプレートを再取得していますか? (その部分は両者の間で全く変わっていないようだ。) –

10

これは、—に出会う可能性のある他の人にとって有益であり、jQueryのPromiseの進歩のおかげで— T.J.全負荷—を待っている間、ユーザー—に任意のフィードバックを与えない程度のポイントが良いものですが

/** 
* Load multiple JSON files. 
* 
* Example usage: 
* 
* jQuery.getMultipleJSON('file1.json', 'file2.json') 
* .fail(function(jqxhr, textStatus, error){}) 
* .done(function(file1, file2){}) 
* ; 
*/ 
jQuery.getMultipleJSON = function(){ 
    return jQuery.when.apply(jQuery, jQuery.map(arguments, function(jsonfile){ 
    return jQuery.getJSON(jsonfile); 
    })).then(function(){ 
    var def = jQuery.Deferred(); 
    return def.resolve.apply(def, jQuery.map(arguments, function(response){ 
     return response[0]; 
    })); 
    }); 
}; 

:クラウダーの答えは今1つの簡潔で一般的な機能に改善することができます。応答性の高いフィードバックを好む人にとっては、進捗状況をサポートする少し複雑なバージョンがあります。

/** 
* Load multiple json files, with progress. 
* 
* Example usage: 
* 
* jQuery.getMultipleJSON('file1.json', 'file2.json') 
* .progress(function(percent, count, total){}) 
* .fail(function(jqxhr, textStatus, error){}) 
* .done(function(file1, file2){}) 
* ; 
*/ 
jQuery.getMultipleJSON = function(){ 
    var 
    num = 0, 
    def = jQuery.Deferred(), 
    map = jQuery.map(arguments, function(jsonfile){ 
     return jQuery.getJSON(jsonfile).then(function(){ 
     def.notify(1/map.length * ++num, num, map.length); 
     return arguments; 
     }); 
    }) 
    ; 
    jQuery.when.apply(jQuery, map) 
    .fail(function(){ def.rejectWith(def, arguments); }) 
    .done(function(){ 
     def.resolveWith(def, jQuery.map(arguments, function(response){ 
     return response[0]; 
     })); 
    }) 
    ; 
    return def; 
}; 
関連する問題