我的AJAX調用是在for循環內部構建的。他們需要按順序(同步)。我如何鏈接他們與jQuery?帶jQuery的動態AJAX承諾鏈
13
A
回答
12
:我們可以把返回值在數組例如
var array = ['One', 'Two', 'Three'];
var id = array[0];
var data = getData(id);
for (var i = 1; i < array.length; i++) {
// Or only the last "i" will be used
(function (i) {
data = data.then(function() {
return getData(array[i]);
});
}(i));
}
// Also, see how better the getData can be.
function getData(id) {
return $.ajax({
url: 'http://example.com/' + id,
dataType: 'jsonp',
}).done(function(d) {
var response = d;
console.log(d);
}).fail(function() {
alert('ERROR');
});
}
順便說一句,如果你使用正確的承諾庫,如bluebird,你會使用下面的代碼:
var array = ['One', 'Two', 'Three'];
Promise.reduce(array, function(data, id) {
return data.promise.then(function(result) {
return { promise: getData(id), results: data.results.push(result) };
});
}, []).then(function(data) {
console.log(data.results); // yay!
});
function getData(id) {
return Promise.cast($.ajax({
url: 'http://example.com/' + id,
dataType: 'jsonp',
}).done(function(d) {
var response = d;
console.log(d);
}).fail(function() {
alert('ERROR');
}));
}
正如您所看到的,讀取/寫入的方式更簡單。
9
大多數承諾庫都有這個內置的jQuery?沒有這麼幸運了:
首先,你的函數返回一個承諾:
function getData(id) {
return $.ajax({ // note the return
url: 'http://example.com/'+id,
dataType: 'jsonp',
success: function (d) {
console.log(d);
},
error: function() {
alert("ERROR")
}
});
}
現在,你把它們連在使用.then
調用一個循環。請注意,.then
只有在前一個承諾完成後纔會執行。所以他們將一個接一個地依次運行。
var array = ['One', 'Two', 'Three'];
var p = $.when(1); // empty promise
array.forEach(function(el){
p = p.then(function(){
return getData(el);;
});
});
所有功能將依次運行。還剩下什麼?返回值。當前的實現丟棄返回值。該解決方案使用for
var array = ['One', 'Two', 'Three'];
var p = $.when(1); // empty promise
var results = [];
array.forEach(function(el,index){
p = p.then(function(){
return getData(el);
}).then(function(data){
results[index] = data; // save the data
});
});
p.then(function(){
// all promises done, results contains the return values
});
爲什麼停在那裏,雖然,讓我們把它更好的:)你的整個代碼可以縮短到
["One","Two","Three"].map(makeUrl).map($.get).reduce(function(prev,cur,idx){
return prev.then(cur).then(function(data){ results[idx] = data; });
},$.when(1)).then(function(){
// results contains all responses here, all requests are sync
});
function makeUrl(id){
return "http://example.com"+id+"?callback=?";
}
相關問題
- 1. 鏈jQuery承諾
- 2. 鏈接ajax請求與jQuery的承諾
- 3. javascript ES6動態鏈接承諾
- 4. ajax的承諾
- 5. 角承諾鏈自動化
- 6. 根據響應跳過一個承諾鏈中的jQuery承諾
- 7. ExpressJS /的NodeJS /承諾:從承諾鏈
- 8. 鏈接承諾內的承諾然後()
- 9. 如何破解多個Ajax承諾鏈?
- 10. angularJS鏈承諾
- 11. AngularJS承諾鏈
- 12. 承諾斷鏈
- 13. 承諾鏈條
- 14. 承諾延期AJAX API jQuery的
- 15. jQuery的承諾則無法AJAX
- 16. 如何syncronize的鏈接jQuery的承諾
- 17. 角鏈的承諾
- 18. Q承諾 - 創建一個動態承諾鏈,然後觸發它
- 19. jQuery中承諾的級聯鏈轉換
- 20. 如何解決jQuery中的承諾鏈?
- 21. 打破jQuery Ajax然後/承諾序列
- 22. 帶有承諾的vue-i18n動態語言環境不更新
- 23. 使用帶'require'的承諾來動態加載模塊
- 24. 拒絕承諾鏈
- 25. Javascript承諾鏈 - ES6
- 26. 承諾分裂鏈
- 27. 延誤承諾鏈
- 28. JavaScript承諾鏈接
- 29. 延遲承諾鏈
- 30. 鏈接ngResource承諾
你真的使用「縮短」這個詞嗎? –
是的,我相信我做到了。 –