0

我有这个对 ajax 的 jquery 调用,

function findTaxForProcess(argPrc, argPrcAmount, argPrcDiscount) {
            if (argPrc == '') { return 0; };
            var _valToReturn;

            if ($('#hdnTaxBefore').val() == "true") {
                // if tax is calculated before discount
                $.ajax({
                    url: '/AutoComplete.asmx/FindProcessTax',
                    type: 'POST',
                    timeout: 5000,
                    datatype: 'xml',
                    cache: false,
                    data: 'argProcess=' + argPrc + '&argAmt=' + argPrcAmount,
                    success: function (response) {
                        _valToReturn = $(response).find('double').text();
                        alert(_valToReturn);
                    }
                });
            }

            else {
                // the tax is calculated after discount
                $.ajax({
                    url: '/AutoComplete.asmx/FindProcessTaxAter',
                    type: 'POST',
                    timeout: 5000,
                    datatype: 'xml',
                    cache: false,
                    data: 'argProcess=' + argPrc + '&argAmt=' + argPrcAmount + '&argDiscount=' + argPrcDiscount,
                    success: function (response) {
                        _valToReturn = $(response).find('double').text();
                        alert(_valToReturn);
                    }
                });
            }
            alert('came here ' + _valToReturn);
            return _valToReturn;
        };

问题是第一个警报显示2.873(在其他情况下,它显示2.178),但问题是第二个警报,第二个警报显示,came here undefined??? FTW?黑客出了什么问题?我已经搞砸了2天,但什么也没有!

为什么_valToReturn在第二次警报时未定义的值?并首先定义?有什么帮助吗?

编辑: 警报在第一个警报之后came here _valToReturn执行。所以,正如(几乎!)所有回答者都说,如果它在之前出现,它将是未定义的,我知道,但正如我所说,它是在之前而不是之后执行

4

4 回答 4

2

Ajax 是一个异步请求。到成功事件执行时,警报“来到这里未定义”将已执行。并且到那时该变量还没有被初始化。

更新:在回答您仔细观察的问题时,我相信匿名函数将 valToReturn 视为局部变量。因此,如果您愿意,这些变量位于不同的“堆栈”上。

看到这个: Javascript匿名函数不更新全局变量

或者

在ajax回调函数之外使用变量

和你的类似。

于 2012-09-13T07:57:17.217 回答
0

尝试初始化 _valToReturn值以摆脱 undefined

于 2012-09-13T07:57:40.890 回答
0

如果第二个警报先出现,即如果 undefined 先出现,然后值出现,那么这是因为 ajax 的异步调用。为了克服这个问题,您可以使 ajax 调用同步。

如果第二个警报出现在第一个警报之后,则可能是变量值的问题。

于 2012-09-13T08:04:47.827 回答
0

您可以尝试使用 console.log 来查找哪个先执行,在我看来,“来到这里”的警报应该首先执行,去看看 firebug 或 chrome 控制台

于 2012-09-13T08:08:59.587 回答