1

我有一个函数,它从 AJAX 调用返回数据以确定用户是否有剩余的信用,然后相应地显示数据。奇怪的是该函数没有返回预期的结果。这是代码:

function setupBuildInputs() {
    noCreditsError = '<div class="alert alert-danger">You have no build credits remaining, please contact a representative to purchase more.</div>';

    if ( $('#newWebsiteBuildForm #user_id').length ) { 
        $('#newWebsiteBuildForm #user_id').change(function () {
            userID = $(this).val();
            jQuery.get(SITE_URL + '/ajax.php?action=getBuildCreditsRemaining&id=' + userID, function(numOfCredits) {
                if ( numOfCredits > 0 ) {
                    // Get latest website URL and show it on the page
                    $('#websiteURLHolder').html('Updating...');
                    jQuery.get(SITE_URL + '/ajax.php?action=getNextWebsiteUsername&id=' + userID, function(data) {
                        $('#websiteURLHolder').html(data + '.checkoutyournewsite.com');
                    });
                } else {
                    $('#quickBuildTagsHolder').html( noCreditsError );
                }
            });
        }); 
    }
    $('#newWebsiteBuildForm #template').change(function () {
        // Show the build form items
        numOfRemainingCredits = checkBuildCredits( $('#newWebsiteBuildForm #user_id').val() );
        alert(numOfRemainingCredits);

        if ( numOfRemainingCredits > 0 ) {
            $('#quickBuildTagsHolder').html('Updating...');
            jQuery.get(SITE_URL + '/ajax.php?action=returnQuickBuildTags&template=' + $(this).val(), function(data) {
                $('#quickBuildTagsHolder').html(data);
            });
        } else {
            $('#quickBuildTagsHolder').html( noCreditsError );
        }
    });
}
function checkBuildCredits( userID ) {
    buildCredits = 0;

    jQuery.get(SITE_URL + '/ajax.php?action=getBuildCreditsRemaining&id=' + userID, function(data) {
        buildCredits = data;
    });

    return buildCredits;
}

setupBuildInputs();

使用 firebug 我可以看到对 ajax.php?action=getBuildCreditsRemaining 的调用从页面中提取了正确的 id 并返回了正确的值(9999)。为了进一步调试,我在第二个更改事件处理程序上添加了警报,结果返回为 0 而不是 9999。

接下来我添加了 2 个警报,甚至添加了一个 checkBuildCredits 函数。第一个验证了 ajax 调用有效,并且数据设置为 9999。第二个奇怪的是,在函数返回之前 buildCredits 仍然设置为 0。

在 setupBuildInputs 函数中,第一个更改处理程序使用相同的 ajax 调用并且工作正常,使用这些函数的第二个更改处理程序当然会失败,因为它没有得到 9999 而是看到 0。

有什么想法吗?

4

3 回答 3

0

jquery.get 默认是异步的。所以在你获取数据之前,函数在你的函数中返回 0 值checkBuildCredits

于 2013-10-21T14:19:25.190 回答
0

Instead of $.get() try using the following:

$.ajax({
    url: SITE_URL + '/ajax.php?action=getBuildCreditsRemaining&id=' + userID,
    success: function(data) {
        buildCredits = data;
    },
    asynch: false
});

This will wait for the ajax call to complete before continuing script execution.

于 2013-10-21T14:27:52.050 回答
0

replace checkBuildCredits with this

function checkBuildCredits( userID, successFn ) {


jQuery.get(SITE_URL + '/ajax.php?action=getBuildCreditsRemaining&id=' + userID, function(data) {
    successFn(data);
});

}

Then when you call checkBuildCredits, do it like this

checkBuildCredits( $('#newWebsiteBuildForm #user_id').val(), function(numOfRemainingCredits )
{
 if ( numOfRemainingCredits > 0 ) {
        $('#quickBuildTagsHolder').html('Updating...');
        jQuery.get(SITE_URL + '/ajax.php?action=returnQuickBuildTags&template=' +   $(this).val(), function(data) {
            $('#quickBuildTagsHolder').html(data);
        });
    } else {
        $('#quickBuildTagsHolder').html( noCreditsError );
    }

});

As the others have explained it, jquery.get is Asynchronous. And based on your design, you are treating jquery.get as a Synchronous call.

于 2013-10-21T14:28:09.540 回答