【问题标题】:Extracting a variable in a try-catch block在 try-catch 块中提取变量
【发布时间】:2014-03-02 19:54:58
【问题描述】:

我有一个函数:

function collect_user_balance() {
    userBalance = 0;
    try {
        var args = {
            param: 'name';
        };
        mymodule_get_service({
            data: JSON.stringify(args),
            success: function (result) {
                userBalance = result['0']; //here i am getting the balance as userBalance through service//
            }
        });
    } catch (error) {
        mymodule_error(error)
    }
}

要求是获取用户余额,其他函数中的userBalance。

有点像

var getbal = collect_user_balance();

我对 JavaScript 和这类东西真的很陌生。我该怎么做?

【问题讨论】:

  • 你应该使用var声明userBalance;否则,您将创建一个全局变量。

标签: javascript jquery drupal-7 return-value


【解决方案1】:

问题是mymodule_get_service 是一个异步函数。这意味着它允许代码在运行后运行,即使它本身还没有完成。完成后,它会执行success 函数。但是当它完成时,collect_user_balance 已经完成了,这一行:

var getbal = collect_user_balance();

已经发生得太早了。要修复它,您需要让collect_user_balance() 接受一个回调函数,该回调函数将被调用以让调用者知道信息何时准备好。这可能很难集成,但是当您混合同步和异步代码时就会发生这种情况。一个例子:

function collect_user_balance (callback) {
    try {
        var args = {
            param: 'name';
        };
        mymodule_get_service({
            data: JSON.stringify(args),
            success: function (result) {
                callback(result['0']); //here i am getting the balance as userBalance through service
            }
        });
    } catch (error) {
        mymodule_error(error)
    }
}

那么,你可以这样称呼它:

collect_user_balance(function (userBalance) {
    // do useful stuff with userBalance
});

【讨论】:

    【解决方案2】:

    试试这个:

    function collect_user_balance() {
        userBalance = 0;
        try {
            var args = {
                param: 'name';
            };
            mymodule_get_service({
                data: JSON.stringify(args),
                success: function (result) {
                    userBalance = result['0']; //here i am getting the balance as userBalance through service//
                }
            });
        } catch (error) {
            mymodule_error(error)
        }
    
        return userBalance;
    }
    

    只需要返回var值:return userbalance;

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      最好避免这样的调用,因为它可能会损害您的应用程序等待服务的性能。

      如果您仍然需要这样的功能,您需要使功能同步。 在 jquery 中调用 ajax 时。我们可以使用一个名为 async 的属性,该属性默认为 true,必须设置为 false 才能使调用同步。

      function collect_user_balance() {
          userBalance = 0;
          try {
              var args = {
              param: 'name';
              };
      
          jQuery.ajax({
              url: "http://someurl.com/ws",
              data: JSON.stringify(args),
              success: function(data) {
                   userBalance = (int)data;
              },
              async:false
              });
          } 
          catch (error) {
              mymodule_error(error)
          }
          return userBalance ;
      }
      

      请注意我没有测试过代码。如果有错误请告诉我

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 2014-12-13
        • 2014-06-23
        相关资源
        最近更新 更多