承诺链如何运作?

时间:2014-11-23 15:25:10

标签: javascript jquery json promise angular-promise

我在SO中找到了以下代码,我尝试调试它以便更好地理解promise概念,目前在下面的代码中有一些我不理解的东西,这就是为什么最后一个得到了id == 4的值(在specificTweet中)而不是所有的推文列表?

$.get('profile.json').then(function (profile) {

    return $.get('tweets.json').then(function (response) {
        return response.filter(function (tweet) {
            //this is return that not related to the promise just to the filter
            return tweet.id === 4;
        });
    });

}).then(function (specificTweet) {

...

这是JSON文件,

[
  {
   "id": 1,
   "tweet": "OMG, worst day ever, my BF @BobbyBoo dumped me",
   "usersMentioned": [
     {
      "id": 10,
      "username": "BobbyBoo"
     }
    ]
  },
  {
   "id": 2,
   "tweet": "OMG, best day ever, my BF came back to me"
  },
  {
   "id": 3,
   "tweet": "OMG, worst day ever, just don't ask"
  },
  {
   "id": 4,
   "tweet": "@BobbyBoo OMG...just OMG!",
   "usersMentioned": [
     {
      "id": 10,
      "username": "BobbyBoo"
     }
    ]
  }
]

2 个答案:

答案 0 :(得分:1)

当你创建这样的代码时:

doSomething().then(function (result1) {
    return 'foo';
}).then(function (result2) {
    console.log(result2 === 'foo');    // this logs "true" to the console
});

您正在创建一个承诺链。每个.then()都会创建一个新的promise,在原始promise被解析时以及成功处理程序完成时被解析,或者当原始promise被拒绝且失败处理程序完成时被拒绝。新承诺将包含"上次成功/失败处理程序返回的数据。因为代码示例中第一个.then()中的成功处理程序返回已过滤的推文,第二个.then()中的成功处理程序(第二个.then())将从第一个{ {1}})将收到过滤后的列表,而不是原始列表。

你最好see the documentation

但是,代码示例中存在一个小错误。第二个处理程序不会只收到特定的推文,它会收到一个只包含一条推文的列表。

答案 1 :(得分:1)

尝试以相反的方式评估它,从下到上。当您链接then次调用时,以下表达式的结果总是传递给上面的表达式。

4。.then(function (specificTweet)

3. return response.filter(function (tweet) { - >过滤推文并传递上面的结果

2. return $.get('tweets.json').then(function (response) - >传递上面的推文

1。$.get('profile.json') - >将档案传递到上面