我希望链接多个ajax请求,大致如下:获取第一个 JSON,如果成功,则继续获取第二个 JSON,如果成功,则创建一个包含两个 JSON 数据的新对象。
// get first json
$.getJSON('http://www.json1.com').then(function(json1){
return json1
}).then(function(json1){
// get second json
$.getJSON('http://www.json2.com').then(function(json2){
var both = {}
both.one = json1
both.two = json2
return both
})
})
我应该将.then
语句相互嵌套吗?我不完全确定如何获取both
变量。
.then(function(json1){ return json1 })
这是一个不必要的,(几乎(身份呼叫。
.then(function(json1){ …;
您应该始终从then
回调中return
,以便新承诺获得值。您甚至可以返回承诺,这些承诺将被"解开"!
我应该将 .then 语句相互嵌套吗?
无论是嵌套它们还是链接它们并不重要,这就是承诺的伟大之处。链接它们会降低"金字塔"的高度,因此它被认为是更干净的,但是您无法从更高的范围访问变量。在您的情况下,您需要访问 json1
,因此您必须嵌套它们。
我不完全确定如何获取这两个变量。
当您从回调中return
时,您可以将其作为从then
调用中返回的承诺的解析值。
$.getJSON('http://www.json1.com').then(function(json1){
return $.getJSON('http://www.json2.com').then(function(json2){
return {one: json1, two: json2};
})
}).then(function(both) {
// do something with both!
});
我正在编辑这个。 我错误地陈述了问题所在。 问题是both
是在函数内部定义的,除非您将both
定义为函数外部的对象,否则无法在函数外部访问它。 当你创建它时,both
对整个世界都是不可见的,并且你创建both
的唯一访问是用另一个延迟回调来处理它,但你仍然没有定义一个变量来保存该对象,更重要的是,这样做会延迟。
这是一种干净而简单的方法来完成您想要的事情。
var json1=$.getJSON('http://www.json1.com');
var json2=$.getJSON('http://www.json2.com');
var both={};
json1.then(json2).then(function(){
both.one=json1.responseJSON;
both.two=json2.responseJSON;
});
如果你想更酷,把它包装在一个函数中,并将 url 作为参数传递。 只需确保在可以访问它的作用域中声明both
对象即可。