我在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"
}
]
}
]
答案 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}})将收到过滤后的列表,而不是原始列表。
但是,代码示例中存在一个小错误。第二个处理程序不会只收到特定的推文,它会收到一个只包含一条推文的列表。
答案 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')
- >将档案传递到上面