Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于AJAX请求更改webview.request处理程序的返回值_Javascript_Ajax_Google Chrome App - Fatal编程技术网

Javascript 基于AJAX请求更改webview.request处理程序的返回值

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){

在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行代码中广泛使用它。但是,在本例中,我需要从
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扩展。