在try-catch块中提取变量

时间:2014-03-02 19:54:58

标签: javascript jquery drupal-7 return-value

我有一个功能:

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和这类事情都很陌生。我怎么能这样做?

3 个答案:

答案 0 :(得分: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
});

答案 1 :(得分:0)

试试这个:

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;

我希望这可以帮到你

答案 2 :(得分:0)

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

如果您仍然需要这样的功能,则需要使该功能同步。 在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 ;
}

请注意我没有测试过代码。让我知道它是否有错误