我尝试使用their api通过AJAX从BOX服务器下载多个文件。所以我下载每个文件的脚本是这样的:
var args = {
url: url,
headers: headers,
crossDomain: true,
dataType: 'json',
type: 'GET',
error: function(data){
//the server will return a redirect (it corresponds to error event)
console.log(data);
if (data.status == 200 && data.readyState == 4){
// so something with data.responseText
}
else{
alert("The file is not downloadable.");
return;
}
}
};
$.ajax(args);
但是,如果我想下载2个文件,比如A和B,我想在调用AJAX下载后使用它们的内容进行进一步的计算。有时候我得到A(或/和B' s)内容为空的错误。由于ajax asynchronous,我四处搜寻并找出答案。然后我试图设置async: false
,但然后BOX返回两个查询无效。
那我该怎样做才能让它发挥作用呢?
谢谢,
答案 0 :(得分:2)
您需要做的是使用承诺,然后您可以使用.when()。
但是因为这些特殊的AJAX调用没有触发成功回调,我想你需要create your own - deferred objects然后你可以调用resolve()
每个AJAX请求触发错误回调,但data.status
为200.然后你可以使用.when()
并将你的两个延期传递给它。
注意:您需要jQuery> = 1.5
好的,这是代码(fiddle);
var dfd1 = $.Deferred();
var dfd2 = $.Deferred();
$.when(dfd1.promise(), dfd2.promise()).done(function(){
// both are done;
alert('done!');
})
$.ajax({
url: "https://api.github.com",
type:'POST',
error: function(err){
console.log(err);
if(err.readyState === 4) {
dfd1.resolve();
}
},
});
$.ajax({
url: "https://api.github.com",
type:'POST',
error: function(err){
if(err.readyState === 4) {
dfd2.resolve();
}
},
});