JS Promises: 为什么不能设置代码在setTimeout回调后执行?

JS Promises: Why is it that you can't set code to execute after the callback of setTimeout?

我正在阅读 this article 关于 Javascript 中的 promise 链的内容,我对 how can we do something after the avatar has finished showing and gets removed? For instance, we’d like to show a form for editing that user or something else. As of now, there’s no way.

中的部分感到困惑

图像被删除后我们无法做某事的原因是img.remove()不是return承诺吗?还是 setTimeout 回调完成后 return 什么都没有?

它的意思是,通过使用示例中的代码:

setTimeout(() => img.remove(), 3000); // (*)

确切地使用该代码,您无法检测图像何时被删除并在它发生时执行某些操作 - 它的异步删除与外部 Promise 链断开连接。

文章的修复建议是在调用 .remove() 时解析构造的 Promise:

setTimeout(() => {
  img.remove();
  resolve(githubUser);
}, 3000);

或者您可以在 setTimeout 到 运行 中添加更多代码,恰好在图像被删除时。

setTimeout(() => {
  img.remove();
  console.log('removed');
}, 3000);

如果您不执行上述任一操作,而是只是 setTimeout(() => img.remove(), 3000);,3 秒后发生的异步操作不能 除了删除图像之外做任何事情 - 这通常是一个错误。例如,如果你想将另一个 .then 链接到它上面 运行s 当图像被删除时,图像需要在 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 运行,您 必须 return上面的Promise.then,那个Promise必须在延迟结束后resolve。

.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');
});

如果您不return来自上层.then的承诺,或者如果您根本不return任何东西,则下层.then将运行 立即,一旦上面的 .then 完成,这是你不想要的。