第二个完成时如何运行一个异步函数?

时间:2012-07-31 14:46:38

标签: jquery ajax asynchronous jsonp

我有两个功能的问题。我希望chcekResults仅在callAPI完成时运行。

我的点击事件:

$("a#showA").click(function (e) {
    e.preventDefault();
    chceckResults(callAPI(apiKey));
});

和功能:

var Count = 0;
var ContractsArray = new Array();


function callAPI(yourAPIKey){
var enquiry = URL + yourAPIKey;
//alert(enquiry);
$.ajax({
 url: enquiry,
 type: 'GET',
 dataType: "jsonp",
 jsonp: "callback",
 jsonpCallback: "jsonpCallback2",
 complete: function (response, responseCode) {
 },
 success: function (json) {
     $.each(json.Contracts, function (index, contract) {
        // alert("Count before increament : " + Count);
        // alert(contract.ContractCode);
         ContractsArray[Count] = contract.ContractCode;

        // alert("Count after increament : " + Count);
        // alert("ContractsArray[Count]: " + ContractsArray[Count]);
         Count++;

        });
    }
 });
}

function chceckResults(){
alert("Count value in chceckResults : " + Count);
  for(var i = 0; i <= Count; i++){
    alert("ContractsArray[" + i + "]: " + ContractsArray[i]);
  }
}

我希望chcekResults仅在callAPI完成时运行。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

只需在chceckResults的成功处理程序中调用callAPI函数:

success: function (json) {

    chceckResults();

    $.each(json.Contracts, function (index, contract) {
        ContractsArray[Count] = contract.ContractCode;
        Count++;
    });
}

答案 1 :(得分:2)

你想在callAPI完成后运行chcekResults,有几种可能性,它在callAPI成功后运行(我想这是你真正想要的),或者callAPI失败,或者两者兼而有之。

由于callAPI正在进行ajax调用,因此你可以将chcekResults放在ajax的成功回调中。

这样:

$.ajax({
  url: enquiry,
  type: 'GET',
  dataType: "jsonp",
  jsonp: "callback",
  jsonpCallback: "jsonpCallback2",
  complete: function (response, responseCode) {
  },
  success: function (json) {
  $.each(json.Contracts, function (index, contract) {
    // alert("Count before increament : " + Count);
    // alert(contract.ContractCode);
    ContractsArray[Count] = contract.ContractCode;

    // alert("Count after increament : " + Count);
    // alert("ContractsArray[Count]: " + ContractsArray[Count]);
    Count++;
   });
   // --------------------- Edit Begins -------------------------
   chcekResults(...);   // This is run after ajax response returns.
   // --------------------- Edit Ends -------------------------
  }
});

这是快速的方法,如果你想使它更通用,你可以将chcekResults作为回调传递给ajax,这样如果定义了这个回调,那么运行它,如果没有,忽略。这样,您可以使用此ajax,无论是否有回调。

答案 2 :(得分:1)

checkResult callAPI回调中致电success。 一旦函数返回,就会调用Success