以下代码从每个getJSON方法返回RSVP承诺:
getJSON('/login')
.then(getJSON('/errors').then(function(users) {
self.user = users;
}))
.then(getJSON('contacts').then(function(contacts) {
self.contacts = contacts;
}))
.then(getJSON('companies').then(function(companies) {
self.companies = companies;
callback(self);
}, function(err){
console.log('does not get here')
}));
我对promises的理解显然是错误的,我不想为每个提供错误回调,而是我认为错误会转发到后续函数之一的下一个可用错误回调中。< / p>
在上面的代码中,第2行的getJSON将被拒绝,但它不会转发到上一次的错误回调中。
我是否必须为每个提供错误回调。这与回调地狱似乎没什么不同。
答案 0 :(得分:3)
你有没有理由不立刻提出所有要求?
self.user = getJSON("login");
self.contacts = getJSON("contacts");
self.companies = getJSON("companies");
// not sure what "/errors" does or what you assign it to, add it if you please
//.hash will go through object properties and wait for all promises to resolve
return RSVP.hash(self).then(function(results){
//here, self now contains .user .contacts and .companies
callback(self); //DO NOT do this, instead return the promise
}).catch(function(err){
//this is where all error handling goes
});
注意那里的return
,最好返回承诺而不是回电,你可以从外面.then
。
答案 1 :(得分:2)
我认为你是以错误的方式束缚你的承诺。在上一次完成之后,您的getJSONS不会连续执行。 当你调用第一个getJSON(getJSON('/ login'))时,你没有将两个处理程序传递给它的then方法。您正在传递一个新的getJSON调用。这意味着,在调用getJSON之后(但在ajax调用结束之前),您正在执行第二个getJSON(getJSON('/ errors'))。您将生成的promise作为getJSON('/ login')的then方法的第一个参数传递。通过这样做,此承诺将使用与getJSON('/ errors')相同的值来解析或拒绝。好的但是......
.then(getJSON('companies').then(function(companies) {
self.companies = companies;
callback(self);
}, function(err){
console.log('does not get here')
}));
在这里,您传递一个新的承诺,由getJSON(公司)返回的承诺作为then方法的第一个参数。这个方法所属的承诺,当被拒绝时,将尝试调用作为第二个参数传递的函数......但是没有!因此,因为getJSON('companies')不拒绝,所以您不会收到错误。我重写了你的链条:
getJSON('/login').then(
function(users) {
self.user = users;
return getJSON('/errors');
}).then(function() {
return getJSON('contacts')
}).then(function(contacts) {
self.contacts = contacts;
return getJSON('companies');
}).then(function(companies) {
self.companies = companies;
callback(self);
}, function(err){
console.log('does not get here')
});
现在我认为它应该可以正常工作。在每个promise的成功解析之后,将执行生成新getJSON请求的函数,并且它将返回其promise。如果他们中的任何一个拒绝,拒绝将通过,直到找到第二个参数,这发生在链的末尾。最后一个函数(错误)将捕获在该点之前出错的任何内容。
答案 2 :(得分:2)
与Benjamin Gruenbaum相似,但略显简洁。
return RSVP.hash({
user: getJSON("login");
contacts: getJSON("contacts");
companies: getJSON("companies");
}}).then(callback).catch(function(err){
//this is where all error handling goes
});