Вызов одного и того же веб-API с другим значением параметра API в цикле - PullRequest
0 голосов
/ 10 октября 2018

У меня есть функция для извлечения данных из веб-API и загрузки их в пользовательском интерфейсе.Я использую угловой js с xmlhttprequest для получения данных.Моя функция, как показано ниже.

     var testMethod = (resolve,reject)=>{
        $scope.responseData = [];
        var startCount =0;
        var isDataAvaialble = true;
        do {
          var url = "ur/api/search?start=" +startCount;
          $http({
          method : 'GET',
          url:url,
         }).then function successCallback(response){
         $scope.data= response.Data;
      for (var i =0 ; i<$scope.data.length; i++)
    {

// do something
    if(condition)
    {
    $scope.resonseData.push($scope.data[i]);
    isDataAvailable = true;
    }
    else
    {
    isDataAvailable =false;
    break;
    }
    }
});
    startCount ++;
    }while(isDataAvailable)
resolve($scope.response);
    };

Но так как я использую Promise внутри цикла, цикл выполняется перед обещанием.Вместо этого, если я использую синхронный цикл xmlhttprequest, он работает.

, то есть вместо

 var url = "ur/api/search?start=" +startCount;
              $http({
              method : 'GET',
              url:url,
             }).then function successCallback(response){

, если я использую

var xhr = new XMLHttpRequest();
    xhr.open("GET", url, false);
    xhr.send(null);
$scope.data = JSON.parse(xhr.responseText);

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

Мне нужно сделать это асинхронно.Мне нужно получить $ scope.responseData в другой функции

1 Ответ

0 голосов
/ 10 октября 2018

Попробуйте что-то вроде этого:

$scope.responseData = [];

function testMethod(startCount = 0) {
    const url = `url/api/search?start=${startCount}`;

    return $http({ method : 'GET', url })
        .then((response) => {
            const data = response.Data;

            for (let i = 0; i < data.length; i++) {
                if(!condition) { return; }

                $scope.responseData.push(data[i]);
            }

            return testMethod(startCount + 1);
        });
}

testMethod();
...