Javascript 基于AJAX请求更改webview.request处理程序的返回值
在Chrome应用程序中,我有一个Javascript 基于AJAX请求更改webview.request处理程序的返回值,javascript,ajax,google-chrome-app,Javascript,Ajax,Google Chrome App,在Chrome应用程序中,我有一个webview,它使用onHeadersReceived处理程序将某些请求重定向到动态构建的数据URI。数据URI依赖于来自远程脚本的数据,该脚本处理来自原始URL的内容 function getDataUri(myurl, callback) { var url = "http://some.where/myscript?url=" + myurl; $.getJSON(url, function(data){
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行代码中广泛使用它。但是,在本例中,我需要从webrequest
事件处理程序中链接getDataUri()
函数,我不知道这是如何实现的。如果可能的话
要对该问题进行更详细的阐述,请执行以下操作:
真正的问题是,在数据URI就绪之前,事件侦听器无法返回。由于我们无法传递承诺或回调,我们将不得不等待dataUri
被填充。这意味着某种形式的同步模式,这就是为什么它可能根本不可能的原因
如果事件处理程序中没有发生这种情况,我可以直接从第一级传递回调。在
content\u脚本文件中是否有可能重复?发布你的manifest.json,我想js文件在加载DOM之前已经解析过了。你说的“实现”是什么意思?异步请求是否可以立即返回它正在获取的值?不可以。是否可以以异步方式执行您尝试执行的任何操作?对在异步回调中,您希望对接收到的数据执行某些操作,而不是返回数据。调用实际使用的任何函数{redirectUrl:datauri}
。将黑色改为return$.getJSON(url,函数(数据){var datauri=“url here”;return datauri;})
@nivas:它不在content\u脚本中。这是一个Chrome打包的应用程序,文件是main.js文件。内容脚本用于Chrome扩展。