【问题标题】:Issue with jQuery deferred and Backbone's success method on savejQuery deferred 和 Backbone 保存成功方法的问题
【发布时间】:2012-08-09 20:20:48
【问题描述】:

所以我尝试使用 jQuery 的 deferred(以及 $.ajax 返回承诺的事实)来处理一些异步代码。

这是一个简单的例子,它显示了正在发生的事情

var update_model = function(model, resp){
    model.set('id', resp.id);
    m = model;
};

var print_id = function(){
    console.log(m.get('id'));
};

var MyModel = Backbone.Model.extend({});
var m = new MyModel({title: 'test'});

var model_promise = m.save({author: 'me'}, {success: update_model});

$.when(model_promise).then(print_id);

问题是 print_idupdate_model 之前被调用,我不知道如何让它发生相反的情况。

在实际示例中,我尝试保存 1 到 100 个模型,我需要先从这些模型中获取 ID,然后才能进行下一步。

我在这里缺少一些基本的东西吗?


编辑

update_model 确实被调用了——它只是在print_id 之后发生。另外,我尝试在model_promise 上使用done 方法,然后使用then

model_promise.done(update_model).then(print_id);

但是update_model 没有收到它的必要参数。

【问题讨论】:

  • 什么是反对票?

标签: jquery backbone.js jquery-deferred


【解决方案1】:

问题是您的 deferred 在成功方法中解决。要使用带有 ajax 方法的延迟,请使用 deferred.done().then() 模式(在此处查看“jqXHR 对象”部分:http://api.jquery.com/jQuery.ajax/)。

var update_model = function(model, resp){ 
  model.set('id', resp.id); 
  m = model; 
};

var print_id = function(){ 
  console.log(m.get('id')); 
};

var MyModel = Backbone.Model.extend({}); 
var m = new MyModel({title: 'test'});

var $model_promise = m.save({author: 'me'});

$model_promise.done(update_model).then(print_id);

【讨论】:

  • 刚刚意识到这可能不会将模型作为第一个属性传递给成功方法...
  • 我已经试过了。通过 promise 的 .done 方法调用 update_model 不会向 update_model 方法传递任何参数,这是正常工作的必要条件。
  • 另外,update_model 方法确实被调用了,但发生在print_id 被调用之后。更新了我最初的问题。
猜你喜欢
  • 1970-01-01
  • 2017-08-08
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
相关资源
最近更新 更多