[英]Redirecting user using chrome.webRequest depending on server response
看来我已陷入困境22。
我在扩展程序中使用Chrome Web Request事件来获取所有Web请求的URL,例如:
chrome.webRequest.onBeforeRequest.addListener(
function(request) {
var cat = getCategory(request.url);
if(cat == "1") {
return {redirectUrl: "http://google.com"}
} else {
return {cancel: false}
}
}
});
然后,我想使用PHP查询服务器以获取URL的类别。 如果类别为1,我想阻止它,如果类别为0,我想允许请求通过。
我看到的最大问题是,因为在getCategory函数中存在一个AJAX请求,所以它不返回值,并且执行仅照常进行。 我需要找到一种方法来阻止执行,直到以某种方式实际收到返回为止,但是我不确定该如何执行操作,同时仍然能够将重定向URL返回给侦听器函数。
同步请求几乎可以工作,除了不能通过同步AJAX请求设置超时。 因此,如果我们的服务器出现故障,则无论类别如何,每个人的Web请求都将被阻止-不理想。
function getCategory(url) {
request = $.ajax( // params);
request.done(function)
// this code executes even before the done block finishes
}
我已经尝试过使用AJAX绑定,例如目前在此使用的.done()函数。 我也尝试过寻找使同步请求超时的方法,并使用.when()。then()函数组合,但是我找不到从其中返回正确范围内的值的方法。
有没有一种方法可以从ajax请求到外部函数获取此值? 我看到的所有尝试都具有错误的返回范围。 有人知道这是否有可能吗?
关于重组代码的想法也被接受! (只要它可以与chrome.webRequest一起使用)
您不会从中得到很多好处。
在理想的情况下,Chrome已经内部构建特定的例外也接受基于承诺回报值。
我怀疑是这种情况,但是您始终可以查看API文档,以提及接受承诺或“ thenable”。
更有可能的解决方案是,您需要将整个"category-1"
请求列表拉入客户端代码。
这要么必须放在程序的对象/数组中,要么放在localStorage
内部。
因为您使用的是Chrome扩展程序,所以我假设在这里可以使用localStorage
。
同样,虽然localStorage
可以工作,但WebSQL(dead)和IndexedDB不能工作,因为它们也是异步访问(即使数据通过客户端的浏览器存储在此处)。
这是您的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.