【问题标题】:Return promise from a Backbone Model从主干模型返回承诺
【发布时间】:2014-03-17 10:35:15
【问题描述】:

我有一个模型,它是从服务器获取的。我想在创建时返回一个承诺,以便使用此模型的视图知道何时渲染。 我可以将 promise 绑定到窗口(或应用程序),但更简洁的方法是在模型初始化时返回它(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
    }

});

【问题讨论】:

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


    【解决方案1】:

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

    但似乎最好将异步和同步操作分开(即获取数据和实例化对象)。在应用程序/控制器/路由器中获取您的模型,然后创建适当的视图并将它们传递给。

    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.
     });
    

    【讨论】:

      【解决方案2】:

      其实你没什么可做的:

      var myPromise = myModel.save();
      

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

      【讨论】:

        【解决方案3】:

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

        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();
          }
        
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-15
          • 1970-01-01
          • 2019-08-14
          • 2016-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多