Это мой первый раз здесь, и я действительно потерял, что делать.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;
}
}
случайно из-за асинхронном, так что если неправильный ответ - последний ответ, он перейдет к «другому», и ответ будет ошибочным.
Любая помощь будет очень признательна !!! Благодаря!
Спасибо за ваш ответ, но я до сих пор не понимаю, как использовать их. Я много читал о обещаниях, и ничего не работает. В функции prom.then (...) Я попытался получить доступ к обещаниюArray [0] и его еще не определено. Мне нужен способ получить все эти значения, он не должен быть последовательным, если я могу сортировать их позже, но мне нужно получить их после цикла. –