根据AJAX请求更改webview.request处理程序的返回值

时间:2017-02-18 13:57:15

标签: 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){
       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。这意味着某种形式的同步模式,这就是为什么根本不可能的原因。

如果在事件处理程序中没有这样做,我可以简单地从第一级传递回调。

0 个答案:

没有答案