如何blocking一个函数,不让它返回?

深夜航船 2014-07-09 10:31:48
初学javascript,在设计chrome插件时遇到一个问题,找了一些资料,也尝试过一些方法,目前不知道如何继续,问题描述如下:

为某个事件添加一个listener, 如何将listener中的回调函数blocking住不让返回,直到点击某个按钮(比如forward按钮),回调函数才会返回,试了几种方法:

1.
while(1)
{
if(forward == 1)
break;
}

结果就是浏览器直接卡死,没有任何悬念。
2.
setInterval(function(){
if(go_forward) {
go_forward = 0;
return {requestHeaders: details.requestHeaders};
}
}, 0);
虽然指定了时间间隔为0,但是函数依然返回了,没有任何作用。

javascript或者其他的javascript库有没有提供这种blocking的支持?
如果没有现成的支持,如何自己用javascript写一个模拟这种bloking的函数?比如模拟alert或者confirm弹出框,如果不点击【确定】,那么就会阻塞在当前的指令上,但是又不会卡死?这种情况改如何实现?


...全文
241 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cn00439805 2014-07-29
  • 打赏
  • 举报
回复

var execFn = function(){
    console.log("come on!执行我!");
}
var queue = [];
queue.exec = function(){
    if(this.length){
        this[0]();
    }
}
chrome.webRequest.onBeforeSendHeaders.addListener(function(details){
    queue.push(execFn);
    //修改http 头部信息
    if(forward){
        queue.exec();
        return;
    }else {
        // blocking;
    }
}, filter, ["blocking", "requestHeaders"]);
 
$btn.addListener("click",function(){
    queue.exec();
});
cn00439805 2014-07-29
  • 打赏
  • 举报
回复

var execFn = function(){
	console.log("come on!执行我!");
}
var queue = [];
queue.exec = function(){
	if(this.length){
		this[0]();
	}
}
chrome.webRequest.onBeforeSendHeaders.addListener(function(details){
	queue.push(execFn);
	//修改http 头部信息
	if(forward){
		queue.exec();
		return;
	}else {
		queue.push(execFn);
		// blocking;
	}
}, filter, ["blocking", "requestHeaders"]);

$btn.addListener("click",function(){
	queue.exec();
});
浮生若梦 2014-07-29
  • 打赏
  • 举报
回复
既然是点击某个按钮之后才返回,为何不把那需要阻塞的返回代码放到点击事件处理函数中呢?
hch126163 2014-07-25
  • 打赏
  • 举报
回复
回调函数!!!
KK3K2005 2014-07-24
  • 打赏
  • 举报
回复
我觉得 最大的问题是 你的需求 你怎么分析你的需求 合理吗? 还是你硬想要一个功能
深夜航船 2014-07-24
  • 打赏
  • 举报
回复
引用 9 楼 KK3K2005 的回复:
onBeforeRequest(可以为同步)
当请求即将发出时产生。这一事件在 TCP 连接建立前发送,可以用来取消或重定向请求。

这里至少可以弹出一个对话框 来决定是不是 cancel


你说的onBeforeRequest是在我的那个事件之前发生的,如果你在这一步取消了请求,那么就到不了我的那个事件了。
深夜航船 2014-07-24
  • 打赏
  • 举报
回复
引用 9 楼 KK3K2005 的回复:
onBeforeRequest(可以为同步) 当请求即将发出时产生。这一事件在 TCP 连接建立前发送,可以用来取消或重定向请求。 这里至少可以弹出一个对话框 来决定是不是 cancel
do_something()如何阻塞住呢?这个不是说我事先知道应该修改什么在do_something中完成返回就可以了,只要用户不forward就一直阻塞住,就想弹出alert或者confirm对话框那样
深夜航船 2014-07-24
  • 打赏
  • 举报
回复
引用 9 楼 KK3K2005 的回复:
onBeforeRequest(可以为同步) 当请求即将发出时产生。这一事件在 TCP 连接建立前发送,可以用来取消或重定向请求。 这里至少可以弹出一个对话框 来决定是不是 cancel
是弹出对话框啊,但是我不会那种alert的对话框啊,我试了模态对话框时不行的,虽然弹出来了,鼠标也不能点,但是后天还是不断地运行,也就是request还是发送出去了
弘毅致远 2014-07-24
  • 打赏
  • 举报
回复
chrome.webRequest.onBeforeSendHeaders.addListener(function(details){
        //修改http 头部信息
        if(forward){
               return;
       }else{
 fuction(){ doSomething().}
}
    }, filter, ["blocking", "requestHeaders"]);
在doSomething()里面处理不行吗?
KK3K2005 2014-07-24
  • 打赏
  • 举报
回复
onBeforeRequest(可以为同步) 当请求即将发出时产生。这一事件在 TCP 连接建立前发送,可以用来取消或重定向请求。 这里至少可以弹出一个对话框 来决定是不是 cancel
深夜航船 2014-07-24
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
不就是两个事件绑定同一个回调吗,在这个回调中登记来源和数据,当总体条件满足时,在调回去
这个逻辑对我来说可能还有点复杂,七楼是我的代码的应用场景,没想明白你说的两个事件绑定同一个回调怎么实现。
深夜航船 2014-07-24
  • 打赏
  • 举报
回复
引用 5 楼 showbo 的回复:
[quote=引用 4 楼 chenyoufu123 的回复:] [quote=引用 1 楼 showbo 的回复:] 搞回调就行了。。干嘛非要阻止其他代码执行。。要获取到正确值后再执行其他代码,你的其他代码放到回调里面 js没有线程概念,可以给你sleep下而不至于搞ui假死
其他代码无法放倒回调函数里面,其他代码是chrome提供的api控制的,现在的状况是使用chrome提供的api,只要函数返回,那么剩下的代码就会直接执行,我没有权利去控制其他代码什么时候执行,只能控制不让回调函数返回。[/quote] chrome提供的api大部分都提供回调,自己认真看api,想好代码的执行循序。。[/quote] 代码如下: 我现在是要开发一个chrome插件,在chrome发送http请求之前,修改http 头部,只有点击了forward按钮之后才让chrome发送出去修改后的头部。现在使用的chrome提供的API如下,只有用这个API才能在发送http之前修改头部信息: chrome.webRequest.onBeforeSendHeaders.addListener(function(details){ //修改http 头部信息 if(forward){ return; }else { blocking; } }, filter, ["blocking", "requestHeaders"]); 我现在的难点是没办法blocking住。只要function(details)返回了,那么chrome会自动把http发送出去的。
xuzuning 2014-07-11
  • 打赏
  • 举报
回复
不就是两个事件绑定同一个回调吗,在这个回调中登记来源和数据,当总体条件满足时,在调回去
Go 旅城通票 2014-07-11
  • 打赏
  • 举报
回复
引用 4 楼 chenyoufu123 的回复:
[quote=引用 1 楼 showbo 的回复:] 搞回调就行了。。干嘛非要阻止其他代码执行。。要获取到正确值后再执行其他代码,你的其他代码放到回调里面 js没有线程概念,可以给你sleep下而不至于搞ui假死
其他代码无法放倒回调函数里面,其他代码是chrome提供的api控制的,现在的状况是使用chrome提供的api,只要函数返回,那么剩下的代码就会直接执行,我没有权利去控制其他代码什么时候执行,只能控制不让回调函数返回。[/quote] chrome提供的api大部分都提供回调,自己认真看api,想好代码的执行循序。。
深夜航船 2014-07-10
  • 打赏
  • 举报
回复
引用 1 楼 showbo 的回复:
搞回调就行了。。干嘛非要阻止其他代码执行。。要获取到正确值后再执行其他代码,你的其他代码放到回调里面 js没有线程概念,可以给你sleep下而不至于搞ui假死
其他代码无法放倒回调函数里面,其他代码是chrome提供的api控制的,现在的状况是使用chrome提供的api,只要函数返回,那么剩下的代码就会直接执行,我没有权利去控制其他代码什么时候执行,只能控制不让回调函数返回。
KK3K2005 2014-07-09
  • 打赏
  • 举报
回复
callback 回调不就可以了 另外listener 本身就是回调的概念
未知数 2014-07-09
  • 打赏
  • 举报
回复
js单线程,用while阻塞当然直接卡死,你用回调函数就行了 js定时器时伪异步执行,不会阻塞,而且里面是另一个作用域(即另外的函数),你在里面返回和外部函数又没关系
Go 旅城通票 2014-07-09
  • 打赏
  • 举报
回复
搞回调就行了。。干嘛非要阻止其他代码执行。。要获取到正确值后再执行其他代码,你的其他代码放到回调里面 js没有线程概念,可以给你sleep下而不至于搞ui假死

87,920

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧