2016-04-04 5 views
0

Я пытаюсь загрузить ряд шаблонов в массив и возникли некоторые проблемы с when метода JQuery (на основе this answer)Использование JQuery, когда с массивом обещаний

var files = [/*array of file names*/]; 
var templates = []; 
files.forEach(function(file){ 
    templates.push(
     $.get('/temps/' + file + '.hbs').then(function(temp) { 
      console.log('done loading', temp); 
     }) 
    ) 
}); 
$.when.apply($, templates).then(function() { 
    console.log(arguments); //"undefined"x10 
}); 

Почему не дает массив обещаний when создать массив из десяти шаблонов? Что здесь не так?

Edit: Видимо, отбрасывая метод then внутри каждого get получает меня немного ближе:

templates.push($.get('/temps/' + file + '.hbs')); 

Однако мне очень интересно, когда я не могу использовать then здесь, а также, когда

templates.push($.get('/temps/' + file + '.hbs')[0]) 

все еще дает мне массив undefined s. Первым элементом в возвращаемом массиве являются возвращенные данные. Почему не будет толкать этот первый элемент?

ответ

2

Потому что обещания в массиве являются обещаниями для undefined, а не обещаниями для ваших шаблонов. Вы должны будете использовать

$.get('/temps/' + file + '.hbs').then(function(temp) { 
    console.log('done loading', temp); 
    return temp; 
// ^^^^^^ 
}) 

получить обещание для шаблона, иначе решить с неявным возвращаемым значением undefined. Помните, что then возвращает новое обещание для результата обратного вызова, а не оригинальное обещание.

+0

Спасибо. Вы видите мое редактирование? Правильно ли это? – 1252748

+0

Это работает очень хорошо. Однако я пытаюсь вернуть эти данные в другую функцию. '$ .when.apply ($, templates) .then (function() { аргументы возврата });' и хранить данные в другой переменной. Итак, например, все ajax будут в функции 'doAjax()', и я пытаюсь сделать var var templatesFromAjax = doAjax() ', но я получаю undefined, когда на следующей строке я делаю' console.log (templatesFromAjax); – 1252748

+0

Да, не используя 'then' на всех тоже правильно. Использование '[0]' не имеет смысла, поскольку обетования не обладают таким свойством. – Bergi

-1

Вы звоните then, который возвращает другое обещание. Если вам просто нужен «побочный эффект», используйте вместо этого done.

+0

Просьба пояснить нижний предел. Мой ответ правильный. – blockhead