在Chrome应用中,我有webview
使用onHeadersReceived
处理程序将某些请求重定向到即时构建的数据URI。数据URI取决于来自远程脚本的数据,该脚本操纵原始URL中的内容。
function getDataUri(myurl, callback) {
var url = "http://some.where/myscript?url=" + myurl;
$.getJSON(url, function(data){
var dataUri = "data:application/json;charset=utf-8;base64,"
+ btoa(JSON.stringify(data));
callback(dataUri);
})
}
webview.request.onHeadersReceived.addListener(
function(info) {
var myDataUri;
getDataUri(info.url, function(dataUri) {
myDataUri = dataUri;
console.log("Here is my data uri:", dataUri);
})
return {redirectUrl: myDataUri}; // This won't work!
},
{urls: ["*://example.com/*"]}, ["blocking"]
);
//Calling it directly works fine:
var url = "http://example.com/some/path";
getDataUri(url, function(dataUri){
console.log("Here is my data uri:", dataUri);
})
同步AJAX请求是一种简单的解决方法,但Chrome应用中不允许这样做。
该示例使用jQuery $.getJSON
,但这并不重要。它可能是一个普通的XHR请求。
我完全了解JavaScript的异步特性,并在2800行代码中广泛使用它。但是,在这种情况下,我需要从getDataUri()
事件处理程序链接webrequest
函数,我无法弄清楚这是如何完成的。而且,如果可能的话。
真正的问题是,在数据URI准备好之前,事件侦听器无法返回。由于我们无法传递承诺或回调,我们将不得不等待填充dataUri
。这意味着某种形式的同步模式,这就是为什么根本不可能的原因。
如果在事件处理程序中没有这样做,我可以简单地从第一级传递回调。