如何打破多个Ajax承诺链?

时间:2015-06-06 03:16:59

标签: javascript ajax ember.js promise

我有多个ajax请求一起工作,并且每个请求都基于先前的请求结果,如果前一个请求返回false,则链应该停止。

这里有一些代码

 //here is a promise chain    

 return this.getBand(id)
            .then(this.getAlbum)
            .then(this.getSong);
//ajax request for getBand
function getBand(id) {
  return Ember.$.ajax({
    data:{id: id},
    url: urls.bandUrl,
  }).then(function(result){
    return result;
  });
};

//ajax request for getAlbum
function getAlbum(result){
  if(result.pass) {
  var bandName = result.name;
  return Ember.$.ajax({
   //...
  })
  } else {
  // i wanna stop the promise chain here, how to do that?
  }
}

1 个答案:

答案 0 :(得分:1)

您可以通过返回rejected Deferred

来指明链中的错误
function getAlbum(result) {
  if (result.pass) {
    // ...
  } else {
    return Ember.$.Deferred().reject('Previous result did not pass');
  }
}

您还可以修改getBand()以检查result.pass本身,因此getAlbum()除非确实通过,否则不会被调用。

function getBand(id) {
  return Ember.$.ajax({
    // ...
  }).then(function(result){
    return result.pass ?
      result :
      Ember.$.Deferred().reject('Band could not be found (' + id + ').');
  });
};

链条不会完全停止,但它只会继续fail个回调/过滤器,作为第二个参数提供给.then().fail()

return this.getBand(id)
    .then(this.getAlbum)
    .then(this.getSong)
    .fail(function (error) {
        // show `error` to user
    });