2015-02-12 210 views
0

我一直有一個問題,在我的getJSON調用完成之前,我的一個方法正在執行。此方法在執行自身之前需要來自調用的數據。

我查了一些東西,例如「deferred calls or .done()」,但是我的主要問題是我的嵌套getJSON調用是可變的,這意味着從我的第一個文件我得到一個數字,創建一個循環,然後根據該數字執行多個getJSON調用,我不能附加.done(),因爲我必須多次執行該操作,並且延遲調用不會出於同樣的原因工作,出於某種原因,第一個.done( )不會等到內的getJSON執行前要求完成......那是應該發生的?

 $.getJSON(file, function(d) 
    { 

     for(var i = 0; i < d.name.length; i++) 
     { 
      files[i] = d.name[i]; 



       fileName = "/"+files[i]; 

      $.getJSON(fileName+'.PNG', function(data) 
      { 


       json[i] = data; 
      }); 
     } 
    }) 

    .done(function() 
    { 
    makeUL(plan); //doesn't work but needs the data from json[i] in order to continue. 
    }) 

    .fail(function(jqxhr, textStatus, error) 
    { 
     var err = textStatus + ', ' + error; 
     console.log("Request Failed: " + err); 
     alert("failed"); 
    }); 

任何人都有一個想法,我怎麼能做到這一點?

感謝所有:)

回答

1

你可以嘗試使用$.when()可用於所有的承諾,完成

$.getJSON(file, function (d) { 
    var requests = $.map(d.name, function (value, i) { 
     files[i] = value; 
     var fileName = "/" + value; 
     return $.getJSON(fileName + '.PEV', function (data) { 
      json[i] = data; 
     }); 
    }); 

    $.when.apply($, requests).done(function() { 
     makeUL(plan); 
    }); 
}).fail(function (jqxhr, textStatus, error) { 
    var err = textStatus + ', ' + error; 
    console.log("Request Failed: " + err); 
    alert("failed"); 
}); 
+0

我會嘗試了這一點...謝謝! – XaolingBao 2015-02-12 03:56:06

+0

這似乎是這樣的作品...你是男人......非常感謝你! 你能解釋一下究竟發生了什麼嗎?整個映射請求和文件[我] =價值沒有循環只是做$ .when.apply等...? 謝謝看起來非常方便,所以我想完全理解它,因爲我是Jquery的新手:)。 – XaolingBao 2015-02-12 06:08:12

+1

@Lasagna'$ .map(d.name,function(){})'做了循環,它返回一個jQuery ajax承諾對象數組,當它傳遞給'$ .when'時,如圖所示將返回一個承諾只有在數組中存在的所有承諾都被解析的情況下才能解決的對象 – 2015-02-12 06:14:03

相關問題