Как работают цепочки обещаний?
Я нашел следующий код в 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')
-> передать профиль выше