每次在我的脚本中发出 HTTP 请求时,我都会尝试向我发布一条消息,sharedWorker
以节省我在每次 HTTP 请求后必须手动执行的操作。
我设法让它像这样工作:
var App = {
__webWorker: null,
__XMLHttpRequest: XMLHttpRequest.prototype.open,
__onScriptComplete: e => {
if( e.data.type && e.data.type === 'worker' ) {
sessionStorage.setItem( 'token', e.data.session.token );
return;
}
}
};
window.addEventListener( 'load', () => {
XMLHttpRequest.prototype.open = (method, url, async, user, password) => {
App.__XMLHttpRequest(method, url, async, user, password);
App.__webWorker.postMessage( '{{md5(session_id())}}' );
};
const worker = new SharedWorker( '{{$router->generate( 'web_notify_worker' )}}' );
worker.port.onmessage = e => App.__onScriptComplete( e );
App.__webWorker = worker.port;
// The below gives me a Uncaught TypeError: Illegal invocation and the App.__webWorker.postMessage is executed
let req = new XMLHttpRequest();
req.open( 'GET', '/', true );
req.send();
// The below works fine but the App.__webWorker.postMessage is not executed
fetch( '/', { method: 'GET' } );
} );
当我创建一个new XMLHttpRequest()
这工作正常并且该sessionStorage
项目是用数据设置的。但是,我不使用XMLHttpRequest
,而是使用fetch()
. 这似乎并没有创造出XMLHttpRequest
我认为的那样。
每次调用 new 时,如何postMessage
在 my 上执行该函数?最好是在完成之后。App.__webWorker
fetch()
更新:这是我自己的框架,我使用 Smarty 模板引擎,所以忽略{{}}
前缀区域。这就是我从 PHP 将数据导入脚本的方式。
更新:我试图这样做,但我得到Uncaught (in promise) TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
:
var App = {
...,
__fetch: fetch
}
fetch = ( uri, args ) => {
App.__fetch( uri, args );
App.__webWorker.postMessage( '{{md5( session_id() )}}' );
};