Javascript 网络工作者内部的微任务
任务和微任务之间的区别很重要,因为。在Promises中包装IndexedDB代码时,这是有问题的,因为在Firefox(可能还有其他浏览器)中,promise解析不会在微任务中发生,所以事务将提交 这个问题的解决方案是使用使用微任务的第三方promise实现。是这些库中的一个,它将微任务问题抽象到另一个库中,称为,它使用Javascript 网络工作者内部的微任务,javascript,promise,indexeddb,web-worker,Javascript,Promise,Indexeddb,Web Worker,任务和微任务之间的区别很重要,因为。在Promises中包装IndexedDB代码时,这是有问题的,因为在Firefox(可能还有其他浏览器)中,promise解析不会在微任务中发生,所以事务将提交 这个问题的解决方案是使用使用微任务的第三方promise实现。是这些库中的一个,它将微任务问题抽象到另一个库中,称为,它使用MutationObserver生成微任务 这在大多数情况下都很有效。但是在一个网络工作者中,MutationObserver不存在,所以这个技巧不起作用。基本上我有这个代码:
MutationObserver
生成微任务
这在大多数情况下都很有效。但是在一个网络工作者中,MutationObserver
不存在,所以这个技巧不起作用。基本上我有这个代码:
var immediate = require('immediate');
var openRequest = indexedDB.open('firefox-indexeddb-promise-worker-test');
openRequest.onupgradeneeded = function() {
var db = openRequest.result;
var store = db.createObjectStore('whatever', {keyPath: 'id'});
store.put({id: 1});
store.put({id: 2});
store.put({id: 3});
};
function get(tx, id, cb) {
immediate(function () {
var req = tx.objectStore('whatever').get(id);
req.onsuccess = function (e) {
console.log('got', e.target.result);
if (cb) {
cb(null, e.target.result);
}
};
req.onerror = function (e) {
console.error(e.target.error);
if (cb) {
cb(e.target.error);
}
};
});
}
openRequest.onsuccess = function() {
var db = openRequest.result;
var tx = db.transaction('whatever');
tx.oncomplete = function () {
console.log('tx complete');
};
get(tx, 1, function () {
get(tx, 2);
});
};
当我正常运行时,它工作正常。当我在Web Worker中运行它时,它会失败,因为在回调运行之前调用immediate
时事务会提交。这在Chrome和Firefox中都会发生
到目前为止,我想到了两种解决方案:
这两种选择都极不令人满意。所以我问你,堆栈溢出,你知道一种在Web Worker中对微任务进行排队的方法吗?简单回答:在Web Worker中你不能这样做
答案很长:没有实际的微任务api,只有尝试模拟它们的黑客。不幸的是,最有效的方法(变异观察者)主要与DOM有关,因此它们只能在主线程中使用,而不能在web worker中使用。尽管如此,对于美洲开发银行和承诺标准化官方关系可能是有意义的,但我不确定是否真的有这样一种承诺,因为承诺和美洲开发银行来自不同的群体。实际上,浏览器供应商可能会对在web workers内部执行真正的微任务api产生一些吸引力,因为大多数反对意见都与意外地冲洗主线程有关 在解析器中同步执行回调的承诺并不像听起来那么糟糕。你只需要确保a)解决方案本身是异步触发的(或至少在回合结束时),b)你可以信任触发解决方案的一方,问题的开头一句是关于“宏观任务”,但之后是“微观任务”。这是故意的吗?如果是,请你解释一下?@Bergi你知道有一个库的行为和你描述的一样吗?@Roamer-1888这是一个打字错误,谢谢。我相信“任务”和“宏任务”在这种情况下是同义词,“微任务”是不同的。我想,你可以使用任何允许你为自己的调度器提供标准化IDB和承诺的工作的工具,但似乎没有太大的吸引力(不过我不是一个浏览器开发人员,所以希望我在这一点上是错的)。