2017-02-14 10 views
1

Это мой первый раз здесь, и я действительно потерял, что делать.AngularJS - API Call in a Loop - получение максимального значения массива и установка ответа

Итак, у меня есть цикл, где я делаю запрос на отправку API. Мне нужно отправить несколько вопросов и вернуть их ставки. После этого мне нужно вычислить наивысшее совпадение и задать ответ в некоторой переменной диапазона $, отображаемой на экране. Проблема заключается в том, что, поскольку вызов является асинхронным, иногда он отображает неправильный ответ (потому что он возвращает последний ответ). Я знаю, что это асинхронно, и у меня должен быть обратный вызов, но я пробовал много способов и до сих пор не могу понять, как это сделать. Все, что я хочу, - это «сортировать» результат, чтобы я мог получить максимальное число и отобразить соответствующий ответ ПОСЛЕ всех вызовов. То, что я до сих пор является то, что:

for (var i = 0; i < $scope.possibleQuestions.length; i++) { 
      var compare = compareAPI($scope.results, $scope.possibleQuestions[i].question, 
         $scope.possibleQuestions[i].answer, 
         $scope.possibleQuestions[i].keywords, 
         $scope.possibleQuestions[i].similar, 
      function (score, question, answer, keywords, similar) { 
       $scope.compareAPI = score.average; 

        if ($scope.compareAPI >= 0.6) { 
         realAnswer = answer; 
         questionsAskedCount++; 
         $scope.answer = realAnswer; 
        } else { 
         var isMatch = matchKeywordAPI(question, keywords); 
         if (isMatch == 0) { 
          $scope.answer = "Please try asking another question!"; 
         } 
         else { 
          //have to return a string just to know, bcause realAnswer is undefined in here, have to return callback function hahahahaha again, or set the answer in the match function 
          $scope.answer = realAnswer; 
         } 

        } 
      }); 
     } 

а другая функция:

function compareAPI (possibleQuestion, possibleAnswer, fn) { 
    console.log("compare API"); 

    var apiMatch = semanticService.getSemantic($scope.studentQuestion, possibleQuestion) 
    apiMatch.then(function (result) {   
     fn(result.data, possibleQuestion, possibleAnswer); 
     console.log(result.data); 
    }, function(error){ 
     $scope.status = 'Unable to load question data: ' + error.message; 
    }); 

} 

Моя самая большая проблема в том, что эта часть

if ($scope.compareAPI >= 0.6) { 
    realAnswer = answer; 
    questionsAskedCount++; 
    $scope.answer = realAnswer; 
    } else { 
     var isMatch = matchKeywordAPI(question, keywords); 
     if (isMatch == 0) { 
      $scope.answer = "Please try asking another question!"; 
     } 
     else { 
      $scope.answer = realAnswer; 
     }       
} 

случайно из-за асинхронном, так что если неправильный ответ - последний ответ, он перейдет к «другому», и ответ будет ошибочным.

Любая помощь будет очень признательна !!! Благодаря!

ответ

0

Обещания могут сделать последовательно, приковав их:

var promise = $q.when(null); 

for (let i=0; i<promiseArray.length; i++) { 
    promise = promise.then(function() { 
     //return promise to chain 
     return promiseArray[i]; 
    }); 
}; 

promise.then(function() { 
    console.log("ALL Promises Done"); 
}); 

Для получения дополнительной информации см AngularJS $q Service API Reference - Chaining Promises.

+0

Спасибо за ваш ответ, но я до сих пор не понимаю, как использовать их. Я много читал о обещаниях, и ничего не работает. В функции prom.then (...) Я попытался получить доступ к обещаниюArray [0] и его еще не определено. Мне нужен способ получить все эти значения, он не должен быть последовательным, если я могу сортировать их позже, но мне нужно получить их после цикла. –