Backbone + Promises - 如何在发布后获取

时间:2016-05-20 10:05:31

标签: javascript backbone.js

我有一个有两个功能的模型 - 一个帖子,一个得到。

获取:

fetch: function (options) {
  var self = this;

  return P1Comm.get({
    'dataType': 'json',
    'processAjaxResponse': self.processAjaxResponse,
    'onStatusInvalid': function (e) {
      P1.log(e, 'status');
    },
    'onSuccess': options.success,
    'onError': function (e) {
      P1.log(e);
    },
    'sourceURL': P1.API_APPS_ROOT + 'v1.0/accepted-terms'
  });
},

帖子:

acceptTerms: function (appId) {
  var self = this;

  self.set({
    'app_id': parseInt(appId,10)
  });
  self.createEdit(self.toJSON(), {
  }).pipe(function () {
    var def = $.Deferred();
    var saveOpts = {
        dataType: 'json',
        stringify: true,
        contentType: 'application/json',
        processData: false,
        processAjaxResponse: self.processAjaxResponse
      };
    self.save(self.toJSON(), saveOpts);
    return def.promise();
  });
},

从视图中调用帖子:acceptAppTerms.acceptTerms(1);

这两者都有自己的作用,但我想改变它,以便: - 发布POST acceptTerms() - 然后进行GET fetch() - 然后调用另一个函数

我认为会是这样的(至少前两点):

acceptAppTerms.acceptTerms(id).then(function () {
  this.launchApp(event, id);
});

但我收到了Uncaught TypeError: Cannot read property 'then' of undefined

的错误

我在前端并不擅长 - 有人能指出我正确的方向吗?

由于

更新:

fetchAcceptedTerms: function () {
  var self = this;
  this.appAcceptedTerms = new T1AppAcceptedTerms();
  this.acceptedTerms = new AppAcceptedTerms();

  this.acceptedTerms.fetch({
    success: function (data) {
      if (data.meta.status === 'success') {
        self.appAcceptedTerms.set(data.data);
      }
    }
  });
},

下面的示例有效,但它会将数据设置中断到模型中。

1 个答案:

答案 0 :(得分:1)

您收到错误的原因是因为acceptTerms没有返回任何内容,换句话说返回undefined没有then()方法。

您的代码应该是:

fetch: function(options) {
    var self = this;
    return P1Comm.get({
      dataType: 'json',
      processAjaxResponse: self.processAjaxResponse,
      onStatusInvalid: function(e) {
        P1.log(e, 'status');
      },
      onSuccess: options.success,
      onError: function(e) {
        P1.log(e);
      },
      sourceURL: P1.API_APPS_ROOT + 'v1.0/accepted-terms'
    });
},

acceptTerms: function(appId) {
    var self = this;
    self.set({
      'app_id': parseInt(appId, 10)
    });

    return self.createEdit(self.toJSON(), {}).pipe(function() {
    //---------------------------------------^ better use .then()
      var saveOpts = {
        dataType: 'json',
        stringify: true,
        contentType: 'application/json',
        processData: false,
        processAjaxResponse: self.processAjaxResponse
      };
      return self.save(self.toJSON(), saveOpts);
    });
},

此代码asummes P1Comm.getself.createEditself.save返回一个promise对象。如果他们没有,那么你需要创建一个Deferred对象并从这些函数中返回它的承诺。在其异步操作的成功/错误回调中,您需要resolve/reject相应的承诺。

我还想提及.pipe()是一种弃用的方法,除非您使用古老版本的jQuery,否则应使用then()