2015-12-14 2 views
1

То, что я хочу достичь, - это PopUpView, который вызывается только после того, как все модели были сохранены.JQuery Promise Backbone Fetch

При запуске кода всплывающее представление запускается до завершения сохранения.

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

ответ

1

Проблема в том, что fetch также является асинхронным. Поэтому, когда вы нажмете на строку $.when.apply(..., promises - пустой массив. Таким образом, обещание, возвращенное when, запускает then напрямую.

+0

Спасибо за ответ, не могли бы вы показать мне, как сделать двойное обещание, чтобы соответствовать выше код? – Brent

+0

Я буду отмечать как правильное, но мне бы хотелось, чтобы вы могли вставить пример :) – Brent

1
  1. Вы можете воспользоваться deferred возвращения на model.fetch и model.save
  2. И вы можете мутировать свое обещание, имея thenreturn a new promise

Вы можете создать свой массив обещаний, как это

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

A й демо http://jsfiddle.net/nikoshr/du44m1ha/

С Jquery 1,8

+0

Не думаю, что это сработает в контексте того, что он будет внутри цикла правильно? – Brent

+1

Это будет зависеть от цикла, '_.map' - это в основном более читаемый цикл – nikoshr

Смежные вопросы