Я не совсем понимаю, как Promise.allSettled может вызывать отказ от решения для одного и того же элемента более одного раза?
Promise.allSettled
не вызывает их вообще. Код, создающий и устанавливающий обещание, выполняет - и может вызывать их более одного раза. Итак, Promise.allSettled
просто обрабатывает этот случай, возвращаясь раньше из функции, в которой вы видели этот комментарий. В случае, когда он не видел урегулирования для обещания по этому индексу, он продолжает работу, поэтому он может заполнить как в массиве, заполнение.
Вот пример функции, которая либо A) вызывает reject
один раз, либо B) вызывает resolve
хотя бы один раз (возможно, более одного раза), а также вызывает reject
:
function findMatchInStream(stream, text) {
return new Promise((resolve, reject) => {
stream.on("line", line => {
if (line.includes(text)) {
resolve(line);
}
});
stream.on("end", () => reject());
});
}
Этот код реагирует на событие Node.js -подобное line
, проверяя строку на предмет заданного текста и, если он найден, вызывает resolve
- даже если он уже вызывал resolve
ранее. Точно так же, когда он достигает конца потока, он вызывает reject
, даже если он вызывал resolve
ранее. Это нормально (хотя, на мой взгляд, бедно), потому что, как только вы уладили обещание, вы уже не сможете уладить его снова ; последующие вызовы resolve
или reject
игнорируются.
К сожалению, я видел в дикой природе такой код просто .