2

我正在尝试使用他们的 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)内容为空的错误。我四处搜索,发现这是因为ajax asynchronous。然后我试图设置async: false,但是 BOX 返回两个查询都是无效的。

那么我该怎么做才能让它发挥作用呢?

谢谢,

4

1 回答 1

2

您需要做的是使用承诺,然后您可以使用.when()

但是,由于这些特定的 AJAX 调用不会触发成功回调,我认为您将需要创建自己的延迟对象,然后您可以调用resolve()每个对象,因为每个 AJAX 请求都会触发错误回调但有data.status200 个。然后您可以使用.when()并传递你的两个延迟。

注意:你需要 jQuery >= 1.5

好的,这是代码(小提琴);

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();
        }
    },
});  
于 2014-05-26T06:54:18.400 回答