Почему это всегда возвращает "неопределенный" - PullRequest
2 голосов
/ 13 февраля 2012

Следующий код всегда возвращает "undefined"

function sendCommand(cmdJson){
    chrome.extension.sendRequest(cmdJson, function(response){
        return response;
    });
}

Я также пробовал этот вариант с тем же результатом

function sendCommand(cmdJson){
    var msg;
    chrome.extension.sendRequest(cmdJson, function(response){
        msg = response;
    });
    return msg;
}

Если я сделаю alert(response); вместо return response;, я получу ожидаемое значение.

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

Я предполагаю, что chrome.extension.sendRequest является асинхронным, и в этом случае sendCommand ничего не возвращает.Обработчик ответа внутри sendCommand - это тот, который возвращает что-то, но это не то же самое, что sendCommand, возвращающий что-то.Поэтому, когда вы вызываете sendCommand, он возвращает undefined.

По сути, sendCommand вызывает функцию chrome.extension.sendRequest, а затем сразу возвращает undefined, пока функция chrome.extension.sendRequest все еще работает.

Нет реального способа заставить что-то асинхронное вести себя синхронно - лучше реструктурировать ваш код.

0 голосов
/ 13 февраля 2012

Скорее всего, потому что вы выполняете ajax-вызов, который по своей природе асинхронный.Асинхронная функция не может вернуть значение, поскольку нет способа узнать, когда завершится асинхронный вызов.

Если вы используете jQuery, у вас есть два альтернативных варианта решения этой проблемы.Если вы используете jQuery 1.5 или более поздней версии, вы можете использовать отложенные объекты.Отложенные объекты - это новый объект, который позволяет использовать jQuery для взаимодействия с асинхронным кодом.

По умолчанию функция jjery ajax (т. Е. $ .Ajax, $ .get, $ .post, $ .getJSON) возвращает отложенный объект, поэтому все, что вам нужно сделать, это сохранить ваш вызов ajax в переменнойи затем вызовите доступные методы, перечисленные в API jQuery Deferred Object.Вот один из лучших уроков, которые я видел в jQuery Deferred Objects.http://www.erichynds.com/jquery/using-deferreds-in-jquery/

var sendResponse = $.get("/getResponse");

//Somewhere else in your code
sendResponse.success(function(response) {
    return response;
});

Другие опции - синхронный вызов jquery ajax.Это можно сделать, установив для свойства async ajax значение false .

$.ajax({
    url: "someURL",
    async: false
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...