[英]Javascript Returns Incorrect Value
我有一个函数,该函数从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。
任何想法在这里发生了什么?
jquery.get默认是异步的。 因此,在获取数据之前,该函数在您的函数checkBuildCredits
返回0值
代替$.get()
尝试使用以下命令:
$.ajax({
url: SITE_URL + '/ajax.php?action=getBuildCreditsRemaining&id=' + userID,
success: function(data) {
buildCredits = data;
},
asynch: false
});
在继续执行脚本之前,这将等待ajax调用完成。
以此替换checkBuildCredits
function checkBuildCredits( userID, successFn ) {
jQuery.get(SITE_URL + '/ajax.php?action=getBuildCreditsRemaining&id=' + userID, function(data) {
successFn(data);
});
}
然后,当您调用checkBuildCredits时,请像这样进行操作
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 );
}
});
正如其他人解释的那样,jquery.get是异步的。 并且根据您的设计,您将jquery.get视为同步调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.