2015-07-11 76 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 –

相关问题