Javascript 用承诺链接多个ajax请求
我希望链接多个ajax请求,大致如下: 获取第一个JSON(如果成功)继续,获取第二个JSON(如果成功),创建一个包含两个JSON数据的新对象Javascript 用承诺链接多个ajax请求,javascript,promise,rsvp.js,Javascript,Promise,Rsvp.js,我希望链接多个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').
// 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
})
})
我应该嵌套
。然后将语句彼此嵌套吗?我不完全确定如何获取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
对象
那是一个不必要的,(几乎)身份电话
您应该始终从返回,然后从回调中返回,这样新承诺就会得到一个值。你甚至可以回报承诺,这将是“打开包装”
我应该嵌套吗?那么语句之间应该相互嵌套吗
不管你是把它们套起来还是把它们拴起来,这都无关紧要。链接它们会降低“金字塔”的高度,因此被认为更干净,但是不能从更高的范围访问变量。在您的情况下,需要访问json1
,因此必须嵌套它们
我不完全确定如何获得这两个变量
当您从回调中返回时,可以将其作为从然后
调用中返回的承诺的解析值
$.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!
});
它不起作用吗?另外,您正在使用.then()
,但这与仅使用回调参数并没有什么区别。为什么不直接用它来代替呢?嗯,我可能没有正确理解这个概念。我想我也应该合并Promise
部分代码>当您想同时等待这两个选项时,通常会使用承诺:var p1=$.getJSON('url1');var p2=$.getJSON('url2');$。当(p1,p2).然后(函数(json1,json2){/*做某事*/})
您可以从返回,然后按他所做的方式回调!Bergi,你的答案是假设他不想访问函数之外的和,他可能不应该,但可能。这正是我想要的。你的解释也为我澄清了一些事情,谢谢!是的,他能。我的回答考虑到了这种可能性。@Bergi-除非有令人信服的相反证据,我仍然认为我的回答更清晰、更灵活,只要两者的范围都是为了避免内存泄漏。@user1167442:否,“回调之外”意味着“尚未加载”。
.then(function(json1){
…;
$.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!
});