Как продолжение
этого моего вопроса, его почти доделали до конца, но остался последний «затык», с которым разобраться не могу.
Суть в том, что несмотря на то, что я HTTP-запросам ставлю синхронный режим, JS-функции всё равно выполняют асинхронную работу. На StackOverflow мне помогли их переделать в callback-функции, но не все. Код сейчас:
function setLink(callback) {
var req = new XMLHttpRequest();
req.open('GET','http://api.service.com',false);
req.send(null);
req.onload = function() {
callback(this.getResponseHeader('Link-Url'));
};
}
function getLink(callback) {
chrome.cookies.get({url:'http://api.service.com', name:'newlink'}, function(cook) {
if ( ! cook)
return setLink(callback);
else
return callback(cook.value);
});
}
chrome.webRequest.onBeforeRequest.addListener(
function(info) {
if(info.url.indexOf('api.service.com') != -1)
return {cancel:false};
getMirror(function(newlink){
return {redirectUrl:info.url.replace(/mysite.com/i, newlink)};
});
},
// filters
{
urls: [
"*://mysite.com/*",
"*://api.service.com/*"
]
},
// extraInfoSpec
["blocking"]
);
Везде теперь расширение получает правильное значение переменной newlink, но проблема в том, что остался один асинхронный вызов функции, который надо переделать в callback-вызов (но у меня не получается).
Конкретно, обработчик:
chrome.webRequest.onBeforeRequest.addListener(function(info) { … }, …);
завершается раньше, чем закончится выполнение вызова:
getMirror(function(newlink){
// здесь newlink получает правильное значение
return {redirectUrl:info.url.replace(/mysite.com/i, newlink)};
});
внутри него. Плюс этот вызов не передаёт результат обработчику, можно поменять вызов хоть на:
getMirror(function(newlink){
return {cancel: true};
});
— разницы не будет.
Помогите переделать асинхронный вызов в callback-вызов.