Как запустить одну асинхронную функцию после завершения второй?

У меня проблема с двумя функциями. я хочу 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 ответа

Решение

Вы хотите, чтобы chcekResults запускался после завершения callAPI, есть несколько возможностей, он запускается после того, как 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 с или без обратного вызова.

Просто позвони chceckResults функция изнутри callAPIОбработчик успеха:

success: function (json) {

    chceckResults();

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

Вызов checkResult в вашем callAPIsuccess Перезвоните.Success вызывается после того, как функция вернулась.

Другие вопросы по тегам