Это говорит о том, что, используя код в примере:
setTimeout(() => img.remove(), 3000); // (*)
Точно используя этот код, вы не можете определить, когда изображение удаляется, и что-то делать, когда оно происходит - его асинхронное удаление отключено от внешней цепочки Promise.
Рекомендация статьи, чтобы исправить это, состоит в том, чтобы иметь построенное разрешение Promise, когда вызывается .remove()
:
setTimeout(() => {
img.remove();
resolve(githubUser);
}, 3000);
Или вы можете добавить больше кода внутри setTimeout
для запуска именно тогда, когда изображение будет удалено.
setTimeout(() => {
img.remove();
console.log('removed');
}, 3000);
Если вы не выполните ни одного из вышеперечисленных действий, и вместо этого у просто setTimeout(() => img.remove(), 3000);
, асинхронное действие, которое происходит через 3 секунды не может ничего сделать, кроме как удалить изображение - что обычно является ошибкой. Например, если вы хотите связать с ним еще один .then
, который запускается при удалении изображения, и через 3 секунды необходимо удалить изображение
.then(() => {
// what logic to put in here to ensure next .then runs after 3 seconds?
setTimeout(() => {
img.remove();
}, 3000);
})
.then(() => {
console.log('image removed');
});
Когда внутри .then
, следующий .then
запуск после задержки, вы должны вернуть обещание из вышеуказанного .then
, и это обещание должно быть выполнено после окончания задержки.
.then(() => {
// what logic to put in here to ensure next .then runs after 3 seconds?
return new Promise((resolve) => {
setTimeout(() => {
img.remove();
}, 3000);
});
.then(() => {
console.log('image removed');
});
Если вы не возвращайте обещание с верхнего .then
, или, если вы вообще ничего не возвращаете, нижний .then
запустится немедленно, как только верхний .then
завершит работу, что вам не нужно.