2015-10-08 4 views
0

Я делаю вызов ajax, чтобы получить массив результатов. Из этого массива я делаю серию вызовов ajax и пытаюсь что-то сделать с результатами. Когда я вернусь Promise.all() и продолжаю .then(function(moreData){}), moreData находится в состоянии ожидания. Я что-то упустил? Я не ожидал, что функция будет запущена до того, как будет решена любая функция doSomethingElse.Цепочка с массивом обещаний

doSomething() 
    .then(function(data){ 
     data = data.d.results; 

     return Promise.all(data.map(function(group){ 
      return doSomethingElse(group.Id); 
     }));     
    }) 
    .then(function(moreData){ 
      //moreData is in pending state 
    }) 
    .then(null, function(err){ 
     alert(err); 
    });   

The doSomething и doSomethingElse функции возвращают отложенный объект.

function doSomething(){ 
    var dfd = $.ajax({...}) 
    return dfd; 
} 
function doSomethingElse(id){ 
    var dfd = $.ajax({...}) 
    return dfd; 
} 
+0

является 'moreData' массив? – Amit

+0

Да, я ожидал, что это будет. Я получаю 'Promise {[[PromiseStatus]]:« ожидающий », [[PromiseValue]]: undefined}' вместо этого. – MickB

+1

Какая версия jQuery? Я думаю, что это будет конфликт между реализацией обещаний jQuery и тем, что «обещание». –

ответ

0

Поскольку ваше обещание (ы) основаны на JQuery, используйте версию JQuery по all, .when(), но это требует некоторого дополнительного кода:

doSomething() 
.then(function(data){ 
    data = data.d.results; 

    var results = new Array(data.length); // Array to hold the results of doSomethingElse 
    return $.when.apply($, data.map(function(group, i){ 
     // Attach a done handler to async operation, put result in results array and return 
     return doSomethingElse(group.Id).done(function(x) { results[i] = x; }); 
    }).unshift($.Deferred().resolve(results)); /* unshift a resolved deferred so that 
                moreData recieve results */ 
}) 
.then(function(moreData){ 
    // moreData is now and array with the resolved results of doSomethingElse() 
}) 
.then(null, function(err){ 
    alert(err); 
}); 
+1

Осторожно, '$ .when' ожидает Отложенные аргументы, а не массив Отложенных. Передача массива приводит к немедленному разрешению этого массива в качестве значения. Вам понадобится '$ .when.apply ($, ...)'. – Shai

+0

Хорошая точка @Shai. Хотите сделать почести? – Amit

+0

Я пытался не использовать .apply(), потому что тогда с динамическим массивом я должен использовать ключевое слово arguments []. Я использовал 'Promise.all()', но только успешно, когда я его не свяжу. – MickB

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