Как прервать цикл For внутри функции асинхронного обратного вызова - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь разорвать вложенный цикл for внутри асинхронного обратного вызова, но не могу сделать это:

function asyncCall(id, OnComplete) {
    // id..
    context.executeQueryAsync(OnSuccess, OnFailure);

    function OnSuccess(sender, args) {
        OnComplete(userInGroup);
    }

    function OnFailure(sender, args) {
        console.error("Doesn't Exist!")
    }
}

function callApi() {
    //response from intial call
    for (var key in response) {
        var data = response[key];
        (function (innerData) {
            if (innerData) {
                renderHTML(innerData);
            }
        })(data);
    }
}

function renderHTML(data) {
    for (var key in data) {
        var index = data[key];
        (function (innerData, id) {
            asyncCall(id, function (isFound) {
                if (isFound)
                    break; //break loop
            });
        })(data, index);
    }
}

callApi();

Я хочу разорвать цикл, если значение свойства isFound имеет значение true в своем ответе, и хочу достичь этого только в ES5, или может помочь любая работа, например, синхронный вызов.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Как сказал Quentin, вы не можете.

Но если вы хотите предотвратить дальнейшие обратные вызовы, вы можете установить переменную, которая предотвращает обратные вызовы.

let isFound = false;

function asyncCall(id, OnComplete) {
  // id..
  context.executeQueryAsync(OnSuccess, OnFailure);

  function OnSuccess(sender, args) {
      if(isFound) return;
      isFound = true;
      OnComplete(userInGroup);
  }

  function OnFailure(sender, args) {
      console.error("Doesn't Exist!")
  }
}
0 голосов
/ 12 ноября 2018

Вы не можете.

Цикл завершится до того, как будет достигнут break.

Единственный способ сделать это - запускать каждый вызов asyncCall в серии вместо параллельно . (например, путем вызова следующей функции обратного вызова, переданной предыдущей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...