Javascript 在jquery$.when(ajax).done(function(){do sth})中,如何对同一回调函数回调两次?

Javascript 在jquery$.when(ajax).done(function(){do sth})中,如何对同一回调函数回调两次?,javascript,jquery,asynchronous,jquery-deferred,Javascript,Jquery,Asynchronous,Jquery Deferred,在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

在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");
    }

});
$.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){
       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";
    }

});
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");
    }

});
A部分启动一个函数(B部分),该函数包含多个ajax post请求,所有请求都被延迟。其中一个请求是在进度条完成后基于回调发出的

每次StartSyncRequest返回时,我都希望它返回到A部分并将结果记录到控制台。因此,我希望它返回几次,但只返回一次(第一个请求“started task”)

有办法做到这一点吗

我不想将StartSyncRequest分解为多个函数,因为在我的代码中,A部分重复了很多次,我希望它将所有的任务调用、进度条和任务检索逻辑封装在一个函数中。

检查以下内容:

解决办法是-

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");
    }

});
$.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){
       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";
    }

});
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");
    }

});

要多次调用回调,请使用progress¬ify函数deferred.No,使用
$.when()无法做到这一点
.Promises只满足/拒绝一次,而不是多次。最简单的方法是在处理过程中的任何时候传递回调并多次调用。我会将回调作为参数传递给请求,或者在.done部分?Bergi的注释起作用-我将回调函数作为匿名函数传递给请求,即d完全去掉了.done()部分。看起来像伪造的问题答案,你可以自己得分。看看我的答案,jquery给你现成的,你不需要重新发明它。