【问题标题】:Chaining multiple ajax requests with promises使用 Promise 链接多个 ajax 请求
【发布时间】:2014-05-15 00:15:55
【问题描述】:

我希望链接多个 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(),但这与仅使用回调参数并没有真正的区别。为什么不直接使用它呢?
  • 嗯,我可能没有正确理解这个概念。我想我也应该加入Promise 部分。
  • 在像你这样的情况下,做$.getJSON('url', function(json1) { $.getJSON('url2', function(json2) { /* work with json1 and json2 */ })});没有问题,当你想同时等待时,你通常会使用承诺:var p1 = $.getJSON('url1'); var p2 = $.getJSON('url2'); $.when(p1,p2).then(function(json1,json2) { /* do something */});

标签: javascript promise rsvp.js


【解决方案1】:
.then(function(json1){
    return json1
})

这是一个不必要的(几乎)身份调用。

.then(function(json1){
     …;

您应该始终从then 回调中return,以便新的promise 获得一个值。你甚至可以返回承诺,这将被“解包”!

我应该将 .then 语句相互嵌套吗?

嵌套或链接它们并不重要,那就是the great thing about promises。链接它们会降低“金字塔”的高度,因此它被认为更干净,但是您不能从更高的范围访问变量。在你的情况下,你需要访问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!
});

【讨论】:

  • Bergi,你的回答是假设他不想在函数之外访问both,他可能不应该这样做,但可能会。
  • 正是我想要的。你的解释也让我明白了一些事情,谢谢!
  • 是的,他可以。我的回答允许这种可能性。
  • @Bergi - 除非有一些相反的令人信服的证据,我仍然认为我的答案更清晰、更灵活——只要两者的范围都可以避免 Mem 泄漏。
  • @user1167442:不,“在回调之外”意味着“尚未加载”。
【解决方案2】:

我正在编辑这个。我错误地说明了问题所在。问题是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 对象即可。

【讨论】:

  • 您可以按照他的方式从then 回调中return
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2019-08-22
相关资源
最近更新 更多