2015-07-11 102 views
0
var json = $.getJSON("sun.json", function(json1) { 
    $.each(json1, function(key, data) { 
     //Json Code 
    }); 
}); 
json.done(function() { 
    $.getJSON("sun2.json", function(json1) { 
     $.each(json1, function(key, data) { 
      //More json Code 
     }); 
    }); 
}); 

能做到這一點嗎?我想用第一個json文件生成一些東西,然後當它完成時,用第二個json文件做更多的事情。我不明白爲什麼它不起作用,但我想我會在這裏得到一些澄清,以防萬一。是否可以在jqxhr.done函數中運行Ajax函數?

+0

是的,你可以,但如果你想從第二個json調用傳遞數據,它會變得更復雜,那麼你必須返回一個承諾,然後你可以通過第一個json.done()。 – Chrillewoodz

+0

請注意,沒有「json函數」這樣的事情。 –

回答

3

是的,您可以在.done函數內執行$.getJSON

這就是說,一個好的做法鏈的$.getJSON電話(感謝jquery promise interface)將利用then功能,可能是這個樣子......

$.getJSON("sun.json", function(json) { 
    $.each(json, function(key, data) { 
     //do something 
    }); 
}) 
.then(function() { 
    return $.getJSON("sun2.json", function(json) { 
     $.each(json, function(key, data) { 
      //do something with sun2.json 
     }); 
    }); 
}) 
.then(function() { 
    return $.getJSON("sun3.json", function(json) { 
     $.each(json, function(key, data) { 
      //so something with sun3.json 
     }); 
    }); 
}); 

鏈遞延承諾這樣阻止"callback pyramid of doom"允許更扁平和更可讀的代碼結構。

附錄 感謝@BenjaminGruenbaum清理我早先的困惑!

+0

我不知道這是如何被接受的 - 完成忽略返回值,這也有延遲反模式(顯式構造反模式)。 –

+0

@BenjaminGruenbaum - 感謝您的反饋,如果您想進一步評論,歡迎對我編輯的答案提供更多反饋。 – sfletche

+0

你的更新將不起作用 - 你需要從'then'返回'',getJSON已經返回一個承諾。你在做什麼是http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

相關問題