如何在JavaScript中使用多个异步调用添加回调函数?

问题描述:

function jsoncall(){ 
    $.getJSON("http://localhost:3000/data", function (data) {...}); 
    $.getJSON("http://localhost:3000/data", function (data) {...}); 
} 

jsoncall.callback(function(){ 
    //do stuff 
}); 

类似上面的伪代码。 JavaScript中是否有一种方法将上述的异步调用看作getJSON如何在JavaScript中使用多个异步调用添加回调函数?

+0

是不是'function(data){...}'回调? :) – Shilly

+1

在功能上,'jsoncall'就像'$ .getJSON' - 你可以简单地执行'jsoncall = $ .getJSON',因为它们在功能上是相同的。如果你需要等待**直到完成,那么我建议查看'$ .Deferred'或ES6 Promise。 – chazsolo

+1

'function jsoncall(){return $ .getJSON(...)}'然后是'jsoncall()。then(callback)'但jQuery的延期实现是imo。根据您使用的版本,不好也不好。我建议你看看“真实”的承诺。 – Thomas

递延:https://api.jquery.com/jquery.deferred/][1]

function jsoncall(){ 
    var $def = $.Deferred(); 
    $.getJSON("http://localhost:3000/data", function (data) { 

     $def.resolve(data); 

    }); 

    return $def; 
} 
jsoncall.done(function(data){ 
    //do stuff 
}); 
+0

没有寻找getJSON的回调,延迟部分是我想要的,设置为答案,谢谢。 –

如果你问我认为你是什么,那么你需要执行callback中的这个函数。

function jsonCall(callback) { 
    $.getJSON('http://localhost:3000/data', function(data) { 
     .... 
     callback(data); 
    }); 
} 

jsonCall(function(data) { 
    ... 
}); 
+0

没有寻找getJSON的回调,而是整个函数的整体,因为它会有多个getJSONs,对不起。 –

Async Call Explained(here)

做一个utils.js,并把你的Ajax功能有把它究竟在哪儿需要。

//utils.js  
function doAjax(callbackFunc, method, url) { 
     var xmlHttpReq = new XMLHttpRequest(); 
     xmlHttpReq.open(method, url); 
     xmlHttpReq.onreadystatechange = function() { 

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) { 
      callbackFunc(xmlHttpReq.responseText,buttonArrayInit); 
      } 


     } 
     xmlHttpReq.send(null); 

    } 



    function loadMyJson(categoryValue){ 
     if(categoryValue==="veg") 
     doAjax(print,"GET","http://localhost:3004/vegetables"); 
     else if(categoryValue==="fruits") 
     doAjax(print,"GET","http://localhost:3004/fruits"); 
     else 
     console.log("Data not found"); 
    }