Я пытаюсь запустить функцию после 1) все циклы завершены и 2) все вызовы базы данных в этих циклах завершены.
Все функции вызова базы данных (segmentDatabaseCall
и stepDatabaseCall
) принимают некоторые аргументы, разрешают Обещание и отправляют данные после завершения вызова. Это (очень) упрощенная версия моего кода:
let localData = {}
segmentDatabaseCall(argument) // Call the database
.then(segmentResult => { // Returns trip segments (array of objects)
$.each(segmentResult, (segmentIndex, segmentValue) => { // For each trip segment...
localData['something'] = segmentValue.something // Add some data to local data
stepDatabaseCall(segmentValue.segment_id) // Call the database once per trip segment...
.then(stepResult => { // Returns trip steps (array of objects)
$.each(stepResult, (stepIndex, stepValue) => { // For each trip step...
localData['something'][i]['something_else'] = stepValue.something_else // Add some data to local data
// THIS DOESN'T WORK
const segsDone = segmentIndex >= segmentResult.length - 1;
const stepsDone = stepIndex >= stepResult.length - 1;
if (segsDone && stepsDone) {
// This if statement runs before all calls are finished 1 out of 3 times roughly
}
})
})
})
})
Вызов базы данных:
function databaseCall (argument) {
return new Promise((resolve, reject) => {
$.ajax({
url: $phpUrl,
type: 'post',
data: {
'argument': argument
}
})
.done (function (data) {
var resultJson = JSON.parse(data)
resolve(resultJson)
})
.fail (function (error) {
reject(error)
})
})
}
Я пытался использовать ответ здесь , но это выполняется до завершения всех вызовов 1 в 3 раза. Я, должно быть, пропускаю какой-то счетчик там?
Я также думаю, что есть способ сделать это, используя карты Promise, но я не могу разобраться с этим.