繁体   English   中英

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

[英]in jquery $.when(ajax).done(function(){do sth}, how can i callback twice to the same callback function?

在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部分在我的代码中重复很多,并且我希望它将所有任务调用,进度条和任务检索逻辑包装在一个函数中。

解决方案是-

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

});

检查一下: 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)
  })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM