我可以忽略 javascript 中的承诺吗?

Dav*_*len 5 javascript promise

我为我的网络工作者设置了一个承诺/延迟,其中主线程对网络工作者的数据进行了更改并告诉我重新计算。我承诺完成后将其召回。

但是,在中间过程中,主线程可以进行额外的更改,再次承诺在完成后回调。(这个中断可能发生是因为 web worker 有时会调用 setTimeout 来允许中断。)此时 web worker 持有 2 个对主线程的 promise,它们都将返回完全相同的值。

可以扔掉第一个承诺,只回电第二个。代码将全部运行良好,主线程逻辑将非常好(实际上更好),只需一个回调。这样做有什么问题吗?

承诺只是一个存储在我保存在哈希表中的对象中的函数。所以如果我从哈希表中删除它,它的内存应该返回到堆中,所以应该没有任何泄漏。

那么我可以让我的回调系统成为骗子吗(在适当的时候)?

Dom*_*nic 5

这是完全合法的。正如 Ben 在评论中指出的那样,在像自动完成这样的情况下它很常见。事实上,我写了一个明确设计的库来支持这种事情:

https://github.com/domenic/last

引用自述文件:

var last = require("last");

var smartSearch = last(doSearch);

$(searchEl).on("input", function (ev) {
    smartSearch(searchEl.value).then(updateUIWithResults).done();
});
Run Code Online (Sandbox Code Playgroud)

被包装的函数将返回一个与原始函数返回的相同类型的承诺。并且一旦您再次调用包装函数,您将可以保证先前返回的挂起承诺永远处于挂起状态,因此您不必担心它们会晚于您的新承诺返回。