JS видимость колбека внутри колбека?
У меня есть код (расширение для хрома), который я не понимаю из-за особенностей js
chrome.runtime.onMessage.addListener( function(message, sender, sendResponse) { $.ajax({ url: "http://some.site" ,type: "POST" ,data: message ,success: function(data) { sendResponse('работает аякс'); } }); sendResponse('просто'); } ); Почему функция sendResponse('работает аякс'); не срабатывает? Подозреваю, что я пытаюсь вызвать sendResponse не в том контексте. Как нужно правильно читать этот код? И как добиться того чтобы колбек success от аякса, смог вызвать sendResponse? |
paka, из того, что ты куда-то передал безымянную функцию с кучей параметров не значит, что ее вызовут с теми параметрами... ;)
|
я не понимаю, почему вызов
sendResponse('просто'); // работает а вызов из аякса sendResponse('работает аякс'); // не работает Прошу мне подсказать, как нужно читать код? |
paka, ты передал куда-то безымянную функцию с кучей параметров...
Ты знаешь как потом ту функцию будут вызывать? Ее будут вызывать с нужными параметрами? Если ее вызовут без параметров - первая же попытка использовать их внутри безымянной функции будет вызывать ошибку. |
Цитата:
function message(Txt) { alert(Txt) }; setTimeout(function(Txt,message){ message(Txt) },1000); Не работающий конечно... :) Т.е. одного начертания имен функций и переменных не хватит для правильной работы кода. |
Цитата:
|
paka, вот рабочий вариант с использование калбек-функции с параметрами...
function message(Txt) { alert(Txt) }; setTimeout((function (Mess,Fnc){ return function(){ Fnc(Mess); } })('Test',message),1000); |
Цитата:
Цитата:
|
У меня проблема в том, что строка 14 выпоняется, те.
sendResponse('просто'); // работает а вызов тойже функциии из строки 10 sendResponse('работает аякс'); // не работает возможно вы уже ответили или я не туда смотрю? |
Цитата:
Остается только правильно "оформить" success. Например так chrome.runtime.onMessage.addListener( function(message, sender, sendResponse) { $.ajax({ url: "http://some.site" ,type: "POST" ,data: message ,success: (function(Fnc){ return function(data){ Fnc('работает аякс'); } })(sendResponse) }); endResponse('просто'); } ); |
Либо так...
chrome.runtime.onMessage.addListener( function(message, sender, sendResponse) { var fnc=function(data){ sendResponse('работает аякс'); }; $.ajax({ url: "http://some.site" ,type: "POST" ,data: message ,success: fnc }); sendResponse('просто'); } ); |
paka, добавьте опцию complete и смотрите статус запроса.
Вообще в консоли все должно быть написано. Вероятно запрос фейлится. |
Цитата:
alert('Test'); в самое начало колбек-функции. :yes: |
Цитата:
function message(Txt) { alert(Txt) }; function test(Fnc){ setTimeout(function(){ Fnc('Ok'); },1000); Fnc('Start'); }; test(message); |
Вроде бы для того, чтобы можно было вызывать sendResponse из асинхронного кода, надо в функции, переданной в chrome.runtime.onMessage.addListener, вернуть true. Чтобы хром знал, что надо дожидаться этого вызова, а не "обрубить все концы" сразу.
См. документацию. |
Часовой пояс GMT +3, время: 23:57. |