Javascript回调函数-如何返回结果?

6

我对回调函数并没有完全理解,而且在最后关头遇到了一些困难。

在JS中,我调用一个函数,然后使用Dojo RPC Json Service调用PHP函数。我在Firebug中逐步跟踪这个函数,PHP正在执行,并通过回调返回给我正确的响应,但我不知道如何将值返回给最初调用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传回到函数一中的变量test。 任何帮助都将不胜感激。

肯定有一种方法可以通过JS执行PHP并返回该值。 - Pjn2020
3个回答

14
这是不可能的,因为回调函数是异步运行的。这意味着在回调执行之前,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)函数。


嗨Kamiel,感谢您的解决方案。这行代码应该放在result.addCallback(下面吗?var result = serviceBroker.getPhp(number,callback); - Pjn2020
你可以将回调函数作为参数添加到 getPhp 函数中,并在获取“成功”结果时调用它。这样,你就可以异步地告诉 getPhp 函数在数据到达时该执行什么操作。 - Kamiel Wanrooij
如果您直接调用 one(response.description); 而不是 callback(response.description); 会怎样? - Florian Courtial
1
@FlorianCourtial,你可以这样做,但那会将getPhpone的实现直接绑定在一起。通常情况下,特别是在测试代码时,将其作为调用者的责任是被认为是良好的实践。这样,你可以根据传入的callback使getPhp执行不同的操作。 - Kamiel Wanrooij

5
简短的回答是你不能这样做。
在回调函数中或从回调函数调用的函数中,可以对数据进行任何想做的操作。但你不能从其中返回任何东西。

你也可以将一个函数作为参数传递给getPhp函数,并让该函数执行某些操作(例如设置属性)以处理回调结果。 - row1
如果你要将数据返回给使小部件旋转的函数,那么请将使小部件旋转的代码移动到回调函数中。 - Quentin

3
一个更为简洁的答案:
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);
            }
        }
    );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接