2014-02-24 49 views
0

我試圖讓AJAX推遲只有當阿賈克斯的名單已經完成返回與。這是我所有的東西(注意這不是真正的劇本,因爲那裏有很多東西,這只是我不能以我可以放在SO上的形式工作的部分)AJAX不被推遲時

function start_search(){ 
     var self=this;//hold to preserve scop 
     var wsu_search = self._get_globals('wsu_search').refresh(); 
     var search_input = self._get_globals('search_input').refresh(); 
     var term = wsu_search.find('input').val(); 
     var queries = Array(); 
     self.search_options.data=[]; 
     $.each(self.search_options.providers, function(i,provider){ 
      $.ui.autocomplete.prototype.options.termTemplate = (typeof(provider.termTemplate) !== undefined && provider.termTemplate !== "") ? provider.termTemplate : undefined; 
      queries.push(run_query(term,provider)); 
     }); 
     //$.whenAll(queries) 
     var defer=$.when.apply($, queries).done(
     function(){ 
      return self.search_options.data; 
     }); 

    } 

    function run_query(term,provider){ 
     var self=this;//hold to preserve scop 
     var search_input = self._get_globals('search_input').refresh(); 
     var result = []; 

     if(typeof(provider)!==undefined && typeof(provider.url)!==undefined && provider.nodes===undefined){ 
      $.ajax({ 
       url: provider.url, 
       dataType: provider.dataType, 
       data: { 
        related:self.search_options.search.getRelated 
       }, 
       success:function(data){ 
        var proData=self.setup_result_obj(term,data); 
        $.merge(self.search_options.data,proData); 
       } 
      }); 
     }else{ 
      //self.search_options.data.push(result); 
     } 
    } 

    start_search(); 

會發生什麼情況是,.done()部分總是success命中前命中。當我對這個有破發點,我可以看到,每個run_query()的的被添加到var queries = Array();.done()之前發生。添加完之後,它會在$.ajax({上突破,這很好。這是但是,所以它擊中.done()然後它擊中了我設置的$.merge()下的success:function(data){}

任何想法如何通過此?到目前爲止,SO上沒有任何幫助,而且我在牆上。

+0

在首位:你爲什麼結合deferreds和'success'? – zerkms

+0

你是什麼意思爲什麼我使用它們兩個? –

+0

沒錯.............. – zerkms

回答

0

爲了使線

queries.push(run_query(term,provider)); 

有意義,run_query應該返回一個承諾。

應當歸還的承諾是由$.ajax()返回的對象,即。

return $.ajax({ 
    ... 
}); 

您可能還想從else{...}子句返回承諾。

+1

可能會道歉我昨天選擇了那是缺少的片斷之一。另一個是@zerkms正確使用「成功」。謝謝你回來 –