2017-01-27 3 views
0

у меня есть вопрос, и я нужна идея для решения :)запрос остановки JQuery AJAX после другого ответа

У меня есть 2 вызов $ .ajax Во-первых, это асинхронный, и во много времени (1 минута например) Во-вторых, это синхронизация (в ajax async: false), и она быстро реагирует (например, 5 секунд)

Второй вызов находится в цикле (request-> response-> print data, request-> response-> > распечатать данные). Мне нужно, когда вы закончите (успех или ошибка), остановите второй звонок.

прилагаю пример кода:

var success = false; 
$.ajax({ 
    type: "POST", 
    url: urlRest, 
    data: { 
     data: dataSend 
    }, 
    success: processOK, 
    error: processError 
}); 

do { 
    $.ajax({ 
     type: "POST", 
     url: urlData, 
     data: { 
      data: dataSend 
     }, 
     async: false, 
     success: function(data, textStatus, jqXHR){ 
      console.log(data);    
     }, 
     error: function(data, textStatus, jqXHR){ 
      console.log("Error"); 
     } 
    }); 
} while (!success); 

Я надеюсь, что это понятно :)

+0

5 секунд для вызова Ajax не быстро для браузера. Некоторым браузерам необходимо обновить интерфейс после каждых 16 мс. Таким образом, ваша страница может закончиться как «страница не реагирует» – Agalo

+0

Никогда не зацикливайте Ajax. Положите следующий звонок в успех или сделанный обратный вызов – mplungjan

+0

то, что вы просите, невозможно. Первый обратный вызов запроса ajax не может выполняться во время выполнения цикла while. –

ответ

-1

Вы можете изменить значение успеха, как этот

$.ajax({ 
    type: "POST", 
    url: urlRest, 
    data: { 
     data: dataSend 
    } 
}).always(function() {success=true;}); 

Или вы можете создать функцию самостоятельного вызова (после второго завершения ajax, вызывает его снова), но перед вызовом его проверки используется переменная успеха, подобная @mplungjan.

+1

Я думаю, ему нужен веб-узел :) – Onaiggac

-1

Никогда не рекомендуется контактировать с Ajax. Вы должны разрешить возврат вызова. Вот пример, который не использует асинхронный ложный

var firstDone = false,tId; 
 
// call long ajax 
 
$.ajax({ 
 
    type: "POST", 
 
    url: urlRest, 
 
    data: { 
 
     data: dataSend 
 
    } 
 
    }).done(processOK); 
 
    }).fail(processError) 
 
    }).always(function() {firstDone=true; clearTimeout(tId);}); // stops the other loop 
 
    
 

 
// setup function that can be looped 
 
function callAjax() { 
 
    if (firstDone) return; 
 
    $.ajax({ 
 
    type: "POST", 
 
    url: urlData, 
 
    data: { 
 
     data: dataSend 
 
    } 
 
    }).done(function(data, textStatus, jqXHR) { 
 
    console.log(data); 
 
    }).fail(function(data, textStatus, jqXHR) { 
 
    console.log("Error"); 
 
    }).always(function() { 
 
    tId=setTimeout(callAjax,1000); // give the server time to recover 
 
    }); 
 

 
} 
 
callAjax();

+0

Ваша петля будет продолжаться, даже если первая ajax-вызов терпит неудачу. Вы должны установить переменную успеха в true в обоих результатах. – Onaiggac

+0

Я вижу - запутался с именем переменной, получившим название success. Я изменил код – mplungjan

+0

Вы можете поместить setTimeout() в переменную a, а затем использовать clearTimeout(), чтобы остановить его. – Onaiggac

0

я исправил проблему, которая будет вызывать некоторые ошибки, попробуйте это.

let printData = function(input){ 

    let config = { 
     urlRest: '', 
     data: { data: {} }, 
     loop: false, 
     callback: false 
    } 

    $.each(config,function(k,v){ config[k] = input[k] }); 
     config.loop = false; 

     $.ajax({ 
      type: 'POST', 
      url: config.urlRest, 
      data: config.data, 
      success: function(data){ 

       // Based on the response if you need to run again change config.loop to true and it will run again 
       // you can also alter anything your sending through 

       if(config.loop) printData(config); 
       else if(typeof config.callback === 'function') callback(); 
      }, 
      error: function(){ 

       // Based on the response if you need to run again change config.loop to true and it will run again 
       // you can also alter anything your sending through 

       if(config.loop) printData(config); 
       else if(typeof config.callback === 'function') callback(); 

      }  
     }); 
} 

printData({ 
    urlRest: '', // URL Here 
    data: data, // Data Object 
    loop: true, // Set this to true if you want it to loop 
    callback: function(){ 
     console.log('Job Complete'); 
    } 
}) 
+0

Я не вижу использования input.loop, это ошибка? – pk86

+0

@ pk86 вход только передает информацию в объект конфигурации, так что вы не можете просто пойти на дикий запад, придерживаясь информации. Только в поданной информации используются значения, которые настраиваются в конфигурации. Первоначально вы не устанавливаете input.loop, но вы меняете config.loop в зависимости от возвращаемого значения от вашей функции ajax. Таким образом, конфигурация становится входной, когда она петли. :-) Общая идея состоит в том, чтобы отвлечь его на одну функцию. Я создаю метод, который никогда не должен быть ошибкой из-за того, что что-то не определено, поскольку конфигурация - это единственное, что имеет значение в конце. –

0

Вы можете запустить асинхронные вызовы в синхронном режиме с использованием SynJS:

function ajaxWrapper(ctx, url, data){ 
    var res={done:false}; 
    $.ajax({ 
     type: "POST", 
     url: url, 
     data: data, 
     success: function(result){ 
      res.data=result; 
     }, 
     error: function(){ 
      res.error=true; 
     }, 
    }).always(function(){ 
     res.done = true; 
     SynJS.resume(ctx); // <-- tell caller that callback is finished 
    }); 
    return res; // <-- return object that will hold the results 
} 

// function that is executed in synchronous manner 
function myFunc(modules, urlRest, urlData) { 
    var success = false; 

    var res1 = modules.ajaxWrapper(_synjsContext, urlRest, urlData); 
    SynJS.wait(res1.done); // <-- wait for result from callback 

    do { 
     var res2 = modules.ajaxWrapper(_synjsContext, urlRest, urlData); 
     SynJS.wait(res2.done); // <-- wait for result from 2nd callback 
    } while (!success); 
} 
var modules = {ajaxWrapper: ajaxWrapper}; 
SynJS.run(myFunc,null, modules, "/", {}, function() { 
    console.log('done'); 
}); 
Смежные вопросы