Я схожу с ума по этой проблеме в моем проекте узла хобби. У меня есть функция (processDataSet
), которая обрабатывает массив данных (inputArray
) и возвращает обещание. Функция использует цикл for для итерации по входному массиву и вызывает функцию saveObjectData
в каждом раунде. Эта функция сохранения обрабатывает одну запись данных, а также возвращает обещание.
Похоже, что в случае сбоя функции saveObjectData
функция processDataSet
отлавливает возвращенное отклонение, но ее собственный reject
не вызывается должным образом внутри цикла for. Я считаю, что это проблема времени, которую я не понимаю. Смотрите результаты вывода отпечатков под кодом.
function processDataSet(inputArray, scriptConfig) {
var contentType = scriptConfig.contentType;
return new Promise(function(resolve, reject) {
if(!Array.isArray(inputArray)) {
return reject(new Error("Input data is not an array. Cannot process."));
}
if(!scriptConfig) {
return reject(new Error("Invalid scriptConfig"));
}
if(!typeof contentType === "string" && !contentType instanceof String) {
return reject(new Error("Invalid contentType for the data set. The parameter should be a string."));
}
console.log("Post processing data for the script " + scriptConfig.name + " (type: " + scriptConfig.contentType + ")");
// Iterate through the input array and handle the objects one-by-one
for (var i = 0; i < inputArray.length; i++) {
saveObjectData(inputArray[i], scriptConfig)
.then(() => {
//continue;
})
.catch(err => {
console.log("TEST PRINT " + scriptConfig.name);
return reject(new Error("Processing data object failed.", err));
});
}
console.log("Resolve " + scriptConfig.name);
return resolve();
});
}
Вывод на печать в консоли:
Post processing data for the script Script1 (type: Season)
Resolve Script1
TEST PRINT Script1
Кажется, что последняя строка журнала, включая «Resolve ...», печатается перед «TEST PRINT ...» в обработчике ошибок. Почему так и как я могу выполнить выполнение, чтобы дождаться полного разрешения всех записей данных, прежде чем вернуться из processDataSet
?
Я не совсем уверен, если в моем случае излишне делать processDataSet
для возврата обещаний, но я сделал это как часть моего устранения неполадок.