在承诺中拒绝处理

时间:2014-03-01 23:44:34

标签: javascript rsvp.js

以下代码从每个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将被拒绝,但它不会转发到上一次的错误回调中。

我是否必须为每个提供错误回调。这与回调地狱似乎没什么不同。

3 个答案:

答案 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
});