从Backbone Model返回承诺

时间:2014-03-17 10:35:16

标签: javascript backbone.js promise backbone-views backbone-model

我有一个从服务器获取的模型。我想在创建时返回一个承诺,以便使用此模型的视图知道何时渲染。 我可以将承诺绑定到窗口(或应用程序),但是当模型初始化时,更简单的方法就是返回它(var promise = new app.User())。 有没有办法做到这一点。而且:这是处理异步数据的好方法吗?

app.User = Backbone.Model.extend({
    urlRoot: baseUrl+"/user",

    initialize: function(){
        this.promise = this.fetch();
        return this.promise; // Doesn't work ofc
    }

});

3 个答案:

答案 0 :(得分:1)

https://github.com/kmalakoff/backbone-modelref

但似乎最好分割同步和同步操作(即获取数据和实例化对象)。在app / controllers / routers中获取模型,然后创建适当的视图并将它们传递给。

var model = new AppModel({ id: 123 });  
// state of model is semi-defined
model.fetch().then(function () {
  // state of model is completely defined
  var view = new AppModelView({ model: model });
  $('.placeholder').html(view.render().$el);
}).fail(function(reason) {
  var view = new AppErrorAlertView({ model: model, error: reason });
  ..
})

我认为,一般来说,制作在模型自身状态下同步操作的方法并不是一个好主意,因为在这种情况下,模型的状态,就其他方法而言,变得不确定。在上面的例子中,我首先创建一个具有半确定状态的对象。或者,您可以使用工厂模式隐藏不确定性 来自客户代码。例如,使用集合:

 var collection = new AppModelCollection();
 collection.fetch().then(function(){
     var model = collection.get(123); // state of model is completely defined.
 });

答案 1 :(得分:0)

实际上你没什么可做的:

var myPromise = myModel.save();

Backbone已经为与API交互的方法返回了promises。

答案 2 :(得分:0)

您可以使用deffered jQuery从主干模型获取中返回一个Promise对象。这样,您可以更好地控制数据的返回方式,还可以在模型本身中提供成功和失败回调以记录错误等。例如:

var model = Backbone.Model.extend({ 
  fetchData: function(){
    var def;
    def = $.Deferred();
    this.fetch({
    success : function(model,response,options) { 
                def.resolve(response);
              }
    error : function(model,response,options) { 
               def.reject(response);
             }
    }); 
    return def.promise();
  }

});