2015-10-02 3 views
0

Это наш код внутри одной функции. Я только начинаю поправляться с BackboneJS.Два выборки и данные BackboneJS заменяются

// let's pull desktop data 
this.desktop = new desktopItemModel({device: 'desktop'}); 
this.desktopPromise = this.desktop.fetch(); 

// let's pull mobile data 
this.mobile = new mobileItemModel({device: 'mobile'}); 
this.mobilePromise = this.mobile.fetch(); 

// I'm not sure if the previous developer was trying to implement similar to $q.all 
this.allPromise = [desktopPromise, mobilePromise]; 

$.when(this.desktopPromise).done(_.bind(function() { 
    // do your desktop stuff 
}, this)); 
$.when(this.mobilePromise).done(_.bind(function() { 
    // do your mobile stuff 
}, this)); 

if (this.allPromise) { 
    $.when.apply($, this.allPromise).done(_.bind(function() { 
    // do your stuff here if desktop 
    .... 
    // do your stuff here if mobile 
    .... 
    }, this)); 
} 

Я заметил, что времена, когда наши данные в нашей переменной смешиваются между настольными и мобильными. Ответ от сервера api в порядке. Я действительно подозревал, что команда API вернула нам неправильные данные, пока я не отлаживал наше приложение, это был наш код, который делал что-то странное.

Как это можно реорганизовать, чтобы данные не смешивались? Кто-то сказал мне в irc, «обещания имеют странное поведение».

+0

Не могли бы Вы описать проблемы с Вашими данными? Что такое смешивание? Этот код немного определяет порядок выполнения кода - третья часть не обязательно будет первой. Обещания не странные, они классные :) – antejan

+0

Когда это. mobilePromise выполняется, мы вызываем другую функцию, чтобы получить дополнительную информацию, необходимую для мобильных устройств. Тем не менее, мне было интересно, почему значение атрибутов было из desktopPromise. Я добавил точку останова в .done этого.mobilePromise. Это происходит не часто, но это происходит. – devwannabe

+0

Возможно, третий блок может работать до второго. У вас есть какая-то логика изменения данных в этой третьей? Я продолжу отвечать, чтобы предоставить некоторый код. – antejan

ответ

1

Давайте перепишем это немного

this.desktop = new desktopItemModel({device: 'desktop'}); 
this.desktopPromise = this.desktop.fetch() 
    .then(function(){ 
     // do your desktop stuff 
    }.bind(this)); 


this.mobile = new mobileItemModel({device: 'mobile'}); 
this.mobilePromise = this.mobile.fetch() 
    .then(function(){ 
     // do your mobile stuff 
    }.bind(this)) 

$.when(this.desktopPromise, this.mobilePromise) 
    .done(function() { 
     // do your stuff here if desktop 
     // do your stuff here if mobile 
    }.bind(this)); 
} 

Попробуйте это. Done будет запущен после того, как обещания будут решены. Вы можете вернуть другую форму заявления «сделай свой мобильный материал» для того, чтобы отсрочить выполнение третьего раздела:

this.mobilePromise = this.mobile.fetch() 
    .then(function(){ 
     // do your mobile stuff 
     var moreMobileDetails = new MoreMobileDetails(); 
     return moreMobileDetails.fetch(); 
    }.bind(this)) 
+0

Прохладный! Я попробую этот код. Большое спасибо! – devwannabe