【问题标题】:How to make wrapped jQuery promise fire the reject callback on error?如何使包装的 jQuery 承诺触发错误时的拒绝回调?
【发布时间】:2013-10-09 13:05:05
【问题描述】:

我用 RSVP 包装了一个简单的 jQuery 承诺,并注意到当我故意导致错误时,永远不会调用失败回调。我认为这是因为当您使用 vanilla jQuery 并且回调抛出错误时,返回的 Promise 不会被移动到失败状态(与规范相反)。

如果我需要使用 jQuery $.ajax 但我想通过 RSVP 获得真正的解析/拒绝回调,我可以对下面的示例做什么(如果有的话)?

var peoplePromise = new Ember.RSVP.Promise(function(resolve, reject) { 
    $.getJSON('/api/people/', resolve).fail(reject).error(reject);     
});                                                                    

var catPromise = new Ember.RSVP.Promise(function(resolve, reject) {    
    $.getJSON('/api/cats/', resolve).fail(reject).error(reject);       
});                                                                    

Ember.RSVP.all([peoplePromise, catPromise]).then(function(things) {    
    things[0].forEach(function(hash) {                                 
        var thing = App.Person.create(hash);                           
        Ember.run(self.people, self.people.pushObject, thing);         
    });                                                                
    things[1].forEach(function(hash) {                                 
        var wat = hash.toJSON(); //this blows up                                      
        var thing = App.Person.create(hash);                           
        Ember.run(self.people, self.people.pushObject, thing);         
    });                                                                
}, function(value) {                                                   
    alert(value.status + ": promise failed " + value.responseText);    
});

【问题讨论】:

    标签: ajax jquery rsvp.js


    【解决方案1】:

    此处示例:http://www.youtube.com/watch?feature=player_detailpage&v=g5CSaK3HqVA#t=1080

    var ajaxPromise = function(url, options){
      return Ember.RSVP.Promise(function(resolve, reject) {
    
        var options = options || {};
    
        options.success = function(data){
          resolve(data);
        };
    
        options.error = function(jqXHR, status, error){
          reject([jqXHR, status, error]);
        };
    
        $.ajax(url, options);
      });
    };
    
    var peoplePromise = ajaxPromise('/api/people/',{
      dataType: "json"
    });
    
    var catPromise = ajaxPromise('/api/cats/',{
      dataType: "json"
    });
    
    Ember.RSVP.all([peoplePromise, catPromise]).then(function(things) {
      things[0].forEach(function(hash) {
        var thing = App.Person.create(hash);
        Ember.run(self.people, self.people.pushObject, thing);
      });
      things[1].forEach(function(hash) {
        var wat = hash.toJSON(); //this blows up
        var thing = App.Person.create(hash);
        Ember.run(self.people, self.people.pushObject, thing);
      });
    }, function(args) {
      var jqXHR = args[0];
      alert(jqXHR.status + ": promise failed " + jqXHR.responseText);
    });
    

    http://emberjs.jsbin.com/aREDaJa/1/

    【讨论】:

    • 为了在 Ember 中正确转换到错误路由,需要将 reject(arguments) 替换为 reject(new Error('your_message'))
    • 有限,我修改了我的答案。从 options.error 传递错误就足够了,我觉得添加默认错误消息很神秘。
    • @finite 在使用这个之后,我发现传入所有 3 个是最有用的。已更新。
    猜你喜欢
    • 2017-12-29
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多