【发布时间】:2018-05-02 00:21:27
【问题描述】:
我正在深入了解如何避免在使用 Promise 加载图像时出现不必要的行为。我的实际使用非常复杂(一个大型的 Threejs 应用程序),因此我将下面的问题归结为一个更易于解释的示例。
我有一个显示图像的画廊 div。有一组缩略图,用户可以单击它加载与该缩略图关联的图像,一旦加载,它就会在画廊 div 中显示(在实际应用程序中,这里使用了一个承诺,因为我们必须加载图像,然后一旦加载创建一个在将纹理传回以应用于平面之前,从中获取纹理)。
我遇到的问题是,如果用户快速单击多个缩略图,它们会按照加载顺序应用到画廊 div,这可能意味着用户可以单击要加载的大图像,然后单击小图像会导致显示的小图像,但随后被较大的图像覆盖(即使它不是最后一个选择,因为它更大,因此加载时间更长)。
我不知道如何优雅地解决这个问题,希望有人能够就其他软件/程序如何处理这个问题提供建议。是否像拥有冗余系统一样简单地查看加载后是否仍然选择图像,如果没有则中止?
【问题讨论】:
-
简单地防止加载图像的函数在它仍在进行中时被调用。这可以通过在请求开始时设置一个标志来完成,然后在请求完成后更新该标志。
-
...这很有意义。
-
试图通过更新上下文标志来解决这项工作是草率的工作。假设您的承诺没有得到解决或无限期地被拒绝。在此期间(如果它结束的话),您的标志将停留在
false并且您不能再提出任何请求。不..!这不是你想要的。看看this answer of mine关于取消先前承诺的类似主题。 -
最简单的方法是存储一个滚动取消令牌,从而允许在创建新的之前取消之前的承诺。
标签: javascript asynchronous promise