РЕДАКТИРОВАТЬ: ВАЖНОЕ ПРИМЕЧАНИЕ. Здесь используется jQuery 1.7.2, и нет, его нельзя изменить с этой версии
Я новичок в обещаниях и пытаюсь обдумать их. Я пытаюсь выполнить ряд функций по порядку, ожидая их завершения, прежде чем создавать дочерние представления (это в Backbone.js). Вот мой код:
initialize: function () {
console.log('AppView::initialized!');
var _this = this;
$.when( _this.processCookies() )
.then( _this.loadAdScripts() )
.then( _this.createChildViews() );
},
processCookies: function () {
var def = $.Deferred();
console.log('(1) PROCESS COOKIES');
return def.resolve();
},
/**
* Instantiates new instances of the child views.
*/
createChildViews: function () {
var _this = this;
console.log('(4) CREATING CHILD VIEWS');
},
loadAdScripts: function () {
var _this = this,
def = $.Deferred();
$.when(
_this.insertScript({
name: 'example1',
async: false,
src: '//www.example.com/script1.js',
}),
_this.insertScript({
is_mobile: is_mobile,
name: 'example2',
async: true,
src: '//example.com/script2.js'
})
)
.done(function () {
console.log('(3) ALL SCRIPTS LOADED');
def.resolve();
});
},
insertScript: function (script) {
var def = $.Deferred(),
protocol = (document.location.protocol === 'https:' ? 'https:' : 'http:');
// dont script 2 on mobile.
if (script.name === 'example2' && script.is_mobile) {
console.log('skipping script');
return def.resolve();
}
var promise = $.ajax({
dataType: 'script',
cache: false,
async: script.async,
url: protocol + script.src,
});
promise.done( function () {
console.log('(2) SINGLE SCRIPT LOADED');
return def.resolve();
});
},
Итак, желаемый поток здесь:
- Когда функция
processCookies()
завершена, - выполнить
loadAdScripts
функцию 2a.insertScript()
срабатывает, скрипт 1 загружает 2b.insertScript()
срабатывает, скрипт 2 загружается - когда ОБА сценария будут завершены, выполните функцию
createChildViews
.
поэтому, наблюдая за console.log()
заполнителями в коде, я ожидаю увидеть в своей консоли:
'(1) PROCESS COOKIES'
'(2) SINGLE SCRIPT LOADED'
'(2) SINGLE SCRIPT LOADED'
'(3) ALL SCRIPTS LOADED'
'(4) CREATING CHILD VIEWS'
однако я фактически вижу следующее:
'(1) PROCESS COOKIES'
'(3) ALL SCRIPTS LAODED'
'(4) CREATING CHILD VIEWS'
'(2) SINGLE SCRIPT LOADED'
'(2) SINGLE SCRIPT LOADED'
Что не так с моими обещаниями и почему они не выполняются в ожидаемом порядке?
$.ajax
возвращает обещание. OP полностью осведомлен об асинхронной проблеме и пытается организовать синхронизацию порядка обратных вызовов. - person charlietfl   schedule 26.09.2015pipe
вместоthen
- person Bergi   schedule 13.11.2015