Jquery Promise Backbone Fetch

时间:2015-12-14 15:35:19

标签: javascript jquery backbone.js underscore.js

我想要实现的是PopUpView只有在保存所有模型后才被调用。

运行代码时,弹出视图会在保存完成之前运行。

var promises = []
_.each(exampleModels, _.bind(function (resource) {
    var filter = this.resources.get(resource.id);
    filter.fetch(
            {
                success: function (model, response) {
                    var participant = new Model({
                        example: "text"
                    });
                    promises.push(participant.save());
                }
            });
}, this));

$.when.apply($, promises).then(_.bind(function () {
    var popupForm = new PopUpView({

    });
    this.$el.append(popupForm.$el);
}, this));

2 个答案:

答案 0 :(得分:1)

问题是fetch也是异步的。因此,当您点击$.when.apply(...行时,promises是一个空数组。因此when返回的承诺会直接触发then

答案 1 :(得分:1)

  1. 您可以model.fetchmodel.save
  2. 享受deferred返回的优势
  3. 您可以通过then return a new promise 1
  4. 来改变您的承诺

    你可以像这样构建你的承诺数组

    var promises = _(ids).chain()
        .map(function(id) {
            // get the models you want 
            return c.get(id);
        })
        .map(function(model) { // build a promise for each model
            return model.fetch(). // promise returned by fetch
                then(function(resp) {
                    var participant = new M({
                        example: "text"
                    });
                    return participant.save(); // promise returned by save
                });
        })
        .value();
    
    $.when.apply($, promises).then(function() {
        console.log('done');
    });
    

    演示http://jsfiddle.net/nikoshr/du44m1ha/

    1 自jQuery 1.8以来