我正在写一个firefox插件,我想在发出每个http请求之前做一些事情。伪代码:
observerService.addObserver(httpRequestObserver, "http-on-modify-request", false);
var httpRequestObserver=
{
observe: function()
{
var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
asyncFunction1(){
// asynchronous function No.1
}.then(asyncFunction2(){
// asynchronous function No.2, this function will be called after asyncFunction1 finished
// do something to httpChannel (edit the request header etc.)
});
//point 1
}
}
问题是asyncFunction2()可能在observe()完成后完成。而根据Firefox,请求将在observe()完成后发出。因此,当asyncFunction2()正在编辑httpChannel时,变量'httpChannel'已经过时(因为observe()结束)。
为了保持在asyncFunction2()完成之前没有发出请求,我需要做主动线程在第1点等待asyncFunction2()。我试图把'setTimeout(function waitfor(){},xxxx )'在第1点,但waitfor()在observe()结束后开始。我还尝试将asyncFunction1& 2放在chrome工作器(类似于web worker)中,让工作线程在asyncFunction2完成时发送一条消息。但是,执行主线程时,javascript似乎无法中断。我发现是javascript只放'收到消息!事件'进入任务队列。因此,当javascript处理消息时,observe()已经返回。