Как работают цепочки обещаний?

Я нашел следующий код в SO, и я пытаюсь отладить его, чтобы лучше понять концепцию обещания. В настоящее время есть кое-что, чего я не понял в приведенном ниже коде, поэтому последние затем получают значение (в specificTweet) с id==4 и не со всеми твитами в списке?

$.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 ответа

Решение

Когда вы создаете такой код:

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

вы создаете цепочку обещаний. каждый .then() создает новое обещание, которое либо разрешается, когда исходное обещание разрешено, и когда обработчик успеха завершается, либо отклоняется, когда исходное обещание отклоняется и обработчик сбоя завершается. Новое обещание будет "содержать" данные, возвращаемые последним обработчиком успеха / неудачи. Так как обработчик успеха в первом .then() в примере кода возвращает отфильтрованные твиты, обработчик успеха во втором .then() (второй .then() называется по обещанию, возвращенному с первого раза .then()) будет получен этот отфильтрованный список, а не исходный список.

Вы бы лучше просто посмотреть документацию.

Однако в примере кода есть небольшая ошибка. Второй обработчик не получит только конкретный твит, он получит список, содержащий только этот твит.

Попробуйте оценить это наоборот, снизу вверх. Результат выражения ниже всегда передается в выражение выше при цепочке then звонки.

4..then(function (specificTweet)

3.return response.filter(function (tweet) { -> фильтровать твиты и передавать результат выше

2.return $.get('tweets.json').then(function (response) -> передать твиты выше

1.$.get('profile.json') -> передать профиль выше

Другие вопросы по тегам