в jquery $ .when (ajax) .done (function () {do sth}, как я могу дважды вызвать одну и ту же функцию обратного вызова? - PullRequest
0 голосов
/ 06 мая 2018

В jquery у меня есть следующий код:

Часть A:

$.when(result = $.startAsyncRequest(arg)).done(function(){
    console.log(result); // this should be called every time something is returned   
    if (result.hasOwnProperty("responseJSON")){
       console.log("build frontend table using completed task");
    }

});

Часть B:

jQuery.extend({

   startAsyncRequest: function(arg){
       console.log(arg);
       $.when(result = makeAjaxRequest(arg)).done(function(){
           var taskid = result.taskid;
           var taskurl = "someurl" + taskid;
           startProgressBar(taskurl, {
           onSuccess: function(){
               $.when(result2 = makeAjaxRequest(taskid)).done(function(){
                  console.log("received completed task"); 
                  return result2;
               });
           });
           return "starting progress bar";
       });
       return "started task";
    }

});

Часть A запускает функцию (Часть B), которая содержит несколько запросов постов ajax, все из которых откладываются. Один из этих запросов делается на основе обратного вызова после завершения индикатора выполнения.

Каждый раз, когда запускается startAsyncRequest, я хотел бы, чтобы он возвращался к части A и записывал результат в консоль. Поэтому я ожидаю, что он будет возвращаться туда несколько раз, но он вернется только один раз (первый запрос, «запущенная задача»).

Есть ли способ сделать это?

Я не хочу разбивать startAsyncRequest более чем на одну функцию, поскольку часть A многократно повторяется в моем коде, и я хочу, чтобы она охватывала все вызовы задач, индикатор выполнения и логику извлечения задач в одной функции .

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Решение было -

Часть A:

$.startAsyncRequest(arg, function(result){
    console.log(result); // this should be called every time something is returned   
    if (result.hasOwnProperty("responseJSON")){
       console.log("build frontend table using completed task");
    }

});

Часть B:

jQuery.extend({

   startAsyncRequest: function(arg, callbackFct){
       console.log(arg);
       $.when(result = makeAjaxRequest(arg)).done(function(){
           var taskid = result.taskid;
           var taskurl = "someurl" + taskid;
           startProgressBar(taskurl, {
           onSuccess: function(){
               $.when(result2 = makeAjaxRequest(taskid)).done(function(){
                  console.log("received completed task"); 
                  callbackFct(result2);
               });
           });
           return callbackFct("starting progress bar");
       });
       return callbackFct("started task");
    }

});
0 голосов
/ 06 мая 2018

Проверьте это: https://api.jquery.com/category/deferred-object/

function wrap(ajaxRequest){
  var defer = $.Deferred();
  ajaxRequest.done(function(resp){
     defer.notify({ "message" : "Done Success", resp : resp })
  }).fail(function(resp){
     defer.notify({ "message" : "Error Failure", resp : resp });
  });
  setTimeout(function(){
     defer.notify({ "message" : "Request is made", resp : null });
  })
  return defer.promise();
}

/// Calling function


  wrap($.ajax({
   // params
  })).progress(function(obj){
     console.log(obj)
  })
...