Задать вопрос
ruskar
@ruskar
Conflict Intelligence Team

Как переписать асинхронные JavaScript-вызовы в callback-вызовы?

Как продолжение этого моего вопроса, его почти доделали до конца, но остался последний «затык», с которым разобраться не могу.

Суть в том, что несмотря на то, что я 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-вызов.
  • Вопрос задан
  • 2828 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vesel4ak
>> завершается раньше, чем закончится выполнение вызова:
Простите, не сильно вникал в суть вопроса и код не смотрел, но, если я правильно уловил суть, то посмотрите в сторону promise. https://www.google.com.ua/search?q=defer&oq=%D0%B2...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы