Javascript обратный вызов - как вернуть результат? - PullRequest
3 голосов
/ 23 июня 2011

Я изо всех сил пытаюсь полностью понять обратные вызовы, и я натыкаюсь на последнее препятствие.

В JS я вызываю функцию, которая затем вызывает функцию PHP, используя службу JSON Dojo RPC. Я прошел через функцию в firebug, и PHP выполняет и возвращает мне правильный ответ через обратный вызов, но я не знаю, как вернуть значение в исходную переменную JS, которая вызвала функцию JS? Э.Г.

JS Function 1

Function one(){

Var test = getPhp(number);

}

function getPhp(number)
{

this.serviceBroker = new dojo.rpc.JsonService(baseUrl + '/index/json-rpc/');

    var result = serviceBroker.phpFunc(number);

    result.addCallback(
        function (response)
        {
            if (response.result == 'success')
            {
                return response.description;
               //I am trying to pass this value back to the 
               //var test value in   function one

            }
        }
    );
}

По сути, теперь мне нужно передать response.description обратно к моей переменной var test в функции one.

Любая помощь приветствуется

Ответы [ 3 ]

11 голосов
/ 23 июня 2011

Это невозможно, поскольку обратный вызов выполняется асинхронно.Это означает, что функция getPhp возвращается до выполнения обратного вызова (это определение обратного вызова, и одна из причин трудного асинхронного программирования ;-)).

То, что вы хотите сделать, - это создать новыйметод, который использует переменную test.Вы должны вызывать этот метод при выполнении обратного вызова.

т.е.

function one(result) {
  var test = result;
  // Do anything you like
}

function getPhp(number, callback) {
  this.serviceBroker = new dojo.rpc.JsonService(baseUrl + '/index/json-rpc/');
  result.addCallback(
    function (response)
    {
        if (response.result == 'success')
        {
           callback(response.description);
        }
    }
  );
}

getPhp(number, function(result) { one(result); });

Этот последний метод создает «анонимную функцию», которая передается в функцию getPhp.Эта функция выполняется во время получения ответа.Таким образом, вы можете передавать данные в one(number) функцию после получения данных.

4 голосов
/ 23 июня 2011

Короткий ответ: вы не можете.

Делайте все, что хотите, с данными в обратном вызове или функциями, которые вы вызываете из обратного вызова.Вы ничего не можете вернуть из этого.

2 голосов
/ 06 июня 2016

Гораздо чище ответ:

getPhp(number);

function one(data){
    var test = data;
    // do what you want
}

function getPhp(number)
{

    this.serviceBroker = new dojo.rpc.JsonService(baseUrl + '/index/json-rpc/');

    var result = serviceBroker.phpFunc(number);

    result.addCallback(
        function (response)
        {
            if (response.result == 'success')
            {
                one(response.description);
            }
        }
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...