【问题标题】:Javascript callback - how to return the result?Javascript回调 - 如何返回结果?
【发布时间】:2017-11-12 06:50:38
【问题描述】:

我正在努力完全理解回调,并且在最后的障碍中磕磕绊绊。

在 JS 中,我调用了一个函数,然后使用 dojo rpc Json 服务调用 PHP 函数。我已经逐步完成了 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 测试变量。

感谢任何帮助

【问题讨论】:

  • 好的就行。必须有一种通过 JS 执行 php 并返回该值的方法

标签: javascript callback


【解决方案1】:

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

【讨论】:

  • 嗨卡米尔感谢您的解决方案。这条线是否应该放在 result.addCallback( var result = serviceBroker.getPhp(number,callback); 下面
  • 您将回调作为参数添加到getPhp 函数,并在获得“成功”结果时调用它。通过这种方式,您可以告诉getPhp 函数在数据到达时要做什么,但以异步方式。
  • 如果你直接调用one(response.description);而不是callback(response.description);呢?
  • @FlorianCourtial 你可以,但这会将getPhpone 的实现直接联系在一起。这被认为是一种很好的做法,特别是在测试代码时,让调用者负责。这样你就可以让getPhp 根据你传入的callback 做不同的事情。
【解决方案2】:

简短的回答是你不能。

对回调中的数据或从回调中调用的函数做任何你想做的事情。你不能从中返回任何东西。

【讨论】:

  • 您也可以将函数作为参数传递给 getPhp,并让该函数对回调结果执行某些操作(例如设置属性)。
  • 如果您要将数据返回给使小部件旋转的函数,则将使小部件旋转的代码移至回调函数。
【解决方案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);
            }
        }
    );
}

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 2016-03-31
    • 2017-07-02
    • 2023-04-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2015-07-06
    相关资源
    最近更新 更多