Проблема с отложенным объектом Jquery при цепочке .then

У меня проблема с моими возвращенными данными для цепочек, а затем с первыми отложенными данными. Первый пример работает:

api.getData().done(function(data){
  api.getData2().done(
    function(data2){
      $.log('success', data2);
    });
  });

Но второй пример ДОЛЖЕН работать, имея data2 для второго .then(), но по какой-то причине это то же самое, что и data1.

api.getData().then(function(data1){
  return api.getData2();
}).then(
function(data2){
  $.log('success', data2);
});

Какие-либо предложения?


person Lucas    schedule 20.11.2012    source источник
comment
Можете ли вы опубликовать код для api.getData2? Если я правильно помню, api.getData2 должен вернуть объект обещания, чтобы это работало правильно, и в какой-то момент он также должен разрешить отложенный объект. У меня была эта проблема раньше.   -  person jedd.ahyoung    schedule 20.11.2012


Ответы (2)


$.when будет принимать две асинхронные функции, возвращающие обещание, и выполнять функцию .then(). когда оба выполнены:

$.when( api.getData(), api.getData2() ).done(function(data, data2) {
    $.log('success', data2);
});

Если по какой-то причине (например, нужны данные) вам нужно выполнить getData() перед getData2(), то действительно нет необходимости в .then(), так как ваш первый пример кажется достаточно подходящим для этого?

person adeneo    schedule 20.11.2012

Итак, после некоторого исследования JQuery Deferred.Pipe я обнаружил, что не могу связать .then, но вместо этого нужно использовать канал, как показано ниже (.pipe() может быть цепочкой):

api.getData().pipe(function(data1){
  return api.getData2();
}).then(
function(data2){
  $.log('success', data2);
});
person Lucas    schedule 20.11.2012
comment
кроме того, вы можете завершить свою цепочку с помощью .then (эквивалентно как .done, так и .fail) - person Lucas; 20.11.2012