Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как передать данные из первого deferred.done в последующие (https://javascript.ru/forum/jquery/23915-kak-peredat-dannye-iz-pervogo-deferred-done-v-posleduyushhie.html)

wwwboy 11.12.2011 22:46

Как передать данные из первого deferred.done в последующие
 
Как передать данные вниз по цепочке вызовов deferred без использования глобальных переменных?

function doSomthing() {
  var ajx = $.ajax(.....);
  ajx.done(function{
    var data = calcAndTransformSomeData();
  });
  return ajx;
};

var job = doSomthing().done((){
  //тут мне необходимо получить data полученный в ajx.done в doSomthing
  var data = ....
});

DjDiablo 12.12.2011 23:56

до конца по этому куску я не в ехал в смысл.
но из того что понял могу предложить следующее.

1) doSomthing - можно бы разместить в замыкании,
в этом же замыкании вы могли бы хранить любую нужную вам информацию.

А вообще у вас адовый код, сто пудово можно проще )))

2) Можно по копать ещё в этом направлении.
Код в качестве примера идеи. Не уверен что он на 100% рабочий, но суть задумки думаю поймёте.

function doSomthing() {
  var ajx = $.ajax(.....);

  // прототип пользовательского обработчика
  ajx.edr=function(d){};
  // метод устанавливающий пользовательский обработчик
  ajx.dataReady=function(f){
    ajx.edr=f;
  }

  // обработчик ajax (если я правильно понял :) )
  ajx.done(function{
     var data = calcAndTransformSomeData();
     // вызываем пользовательский обработчик
     ajx.edr(data);   
  });
  return ajx;
};

var job = doSomthing().dataReady( function(data){
  //здесь data нам передадут в качестве параметра, и с его получением заворачиваться не надо.
  // кроме прочего, метод в dataReady гарантированно будет вызван после calcAndTransformSomeData, а не до него. Что упрощает жизнь !!
  alert(data);
  console.log(data);
});

wwwboy 13.12.2011 00:19

Ну тут ничего адского - обыкновенные deferred объекты, просто их нужно уметь правильно готовить )))
проблема частично решается присваивание this свойства - оно появится в 3м параметре, либо самому deferred объекту, но к сожалению элегантного метода пока не нашел (


Часовой пояс GMT +3, время: 05:14.