Ответ Ajax требует времени для заполнения - PullRequest
0 голосов
/ 28 декабря 2010

У меня есть класс утилит, который мне не принадлежит.Я вызываю один из методов этого класса утилит, который inturn вызывает одну функцию ajax.И возвращает ответ.

Мне нужно принять решение в зависимости от объекта ответа.Проблема в том, что заполнение объекта ответа занимает некоторое время (миллионы секунд).

var selector = dojo.byId("SelectorId");
var theChart = new chart( selector, 135, 92, style, frequency, time);

if(theChart.data ===null){
    console.log("No response");
}else{
    Console.log("Use response data");
}

и

chart( selector, 135, 92, style, frequency, time);

не принадлежит мне.chart () относится к классу util.

, приведенный выше, фрагмент отлично работает с точкой останова.Но когда я удаляю точку останова, она всегда начинает переходить в блок «если».

Как мне решить эту проблему.

Ответы [ 2 ]

1 голос
/ 28 декабря 2010

Объект диаграммы должен обеспечивать своего рода обратный вызов, чтобы вы знали, когда данные доступны.

Что-то вроде

theChart.onData = function(data){ 
  console.log(data);
  // or 
  console.log(theChart.data); 
} 

, если это недоступно, у вас будетиспользовать тайм-ауты, чтобы купить функциональность.Поскольку вы не можете знать, может ли сервер занять некоторое время для ответа, вам, возможно, придется повторять попытку.

Эта (непроверенная) функция должна вызывать внутреннюю функцию до тех пор, пока не станут доступны данные, которые, в свою очередь, вызовут предоставленную функцию обратного вызова.

function chartdata(ch,cb){ 
  (function(){
    if(ch.data === null){
      window.setTimeout(arguments.callee, 100);
    } else {
      cb(ch);     
    }
  })();
}; 

Вы использовали бы ее так:

chartdata(new chart( selector, 135, 92, style, frequency, time), function(theChart){  
  console.log(theChart.data);
});

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

1 голос
/ 28 декабря 2010

Если вы используете setTimeout , это должно решить вашу проблему:

 var selector = dojo.byId("SelectorId");
 var theChart = new chart( selector, 135, 92, style, frequency, time);

 setTimeout(function(){
  if(theChart.data ===null){
   console.log("No response");
  }else{
   Console.log("Use response data");
  }
 }, 100);

В качестве альтернативы вы можете использовать setInterval .В приведенном ниже примере проверяется переменная каждые 100 мсек и возвращается «ложь» после N = 10 попыток:

 var maxTries = 10;
 var checkFunction = function(){
  if(theChart.data === null){
   --maxTries;
  }else{
   Console.log("Use response data");
   clearTimeout(checkFunction);
   return;
  }
  if( 0 == maxTries ) {
   console.log("No response");
   clearTimeout(checkFunction);
  }
 } ;
 setTimeout(checkFunction, 100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...