Javascript 网络工作者内部的微任务

Javascript 网络工作者内部的微任务,javascript,promise,indexeddb,web-worker,Javascript,Promise,Indexeddb,Web Worker,任务和微任务之间的区别很重要,因为。在Promises中包装IndexedDB代码时,这是有问题的,因为在Firefox(可能还有其他浏览器)中,promise解析不会在微任务中发生,所以事务将提交 这个问题的解决方案是使用使用微任务的第三方promise实现。是这些库中的一个,它将微任务问题抽象到另一个库中,称为,它使用MutationObserver生成微任务 这在大多数情况下都很有效。但是在一个网络工作者中,MutationObserver不存在,所以这个技巧不起作用。基本上我有这个代码:

任务和微任务之间的区别很重要,因为。在Promises中包装IndexedDB代码时,这是有问题的,因为在Firefox(可能还有其他浏览器)中,promise解析不会在微任务中发生,所以事务将提交

这个问题的解决方案是使用使用微任务的第三方promise实现。是这些库中的一个,它将微任务问题抽象到另一个库中,称为,它使用
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和承诺的工作的工具,但似乎没有太大的吸引力(不过我不是一个浏览器开发人员,所以希望我在这一点上是错的)。