我的javascript脚本存在一个奇怪的问题。
这是我的代码:
function checkDiscountCode()
{
var discountCode = $('#korcode').val();
var errorMessage = $('#errorMessage').text();
if(discountCode.length > 2)
{
$.getJSON( 'calc.php?code=' + discountCode, function( json )
{
var color = json.color;
var soort = json.soort;
var waarde = json.waarde;
var message = json.message;
if(errorMessage != message)
{
$('#error').html('<font color="' + color + '" id="errorMessage">' + message + '</font>');
}
if(message == 'OK!')
{
var outputData = soort + '-' + waarde;
console.log('outputData = ' + outputData);
return outputData;
}
});
}
}
控制台日志提供正确的数据,例如0-12.00,但是当我在另一个函数中请求此函数时,例如只是一个警报(checkDiscountCode());它说未定义..
任何人都可以帮助我吗?我没有看到这个问题..
提前致谢!
答案 0 :(得分:8)
您的checkDiscountCode()
函数没有return
语句,因此默认返回undefined
。
您包含的return
语句位于作为$.getJSON()
的回调传递的匿名函数内,因此它从返回函数返回到jQuery代码调用它,而不是回到你的代码(如果message
不是'OK!'
,它甚至会返回undefined)。 (另外,$.getJSON()
除discountCode.length > 2
之外不会运行,尽管您的checkDiscountCode()
函数不会尝试以任何方式返回值。)
答案 1 :(得分:1)
如果discountCode.length > 2
不成立,则表示您没有返回值,因此它将返回undefined。
我还要补充一点,如果你把它放在另一个函数alert(checkDiscountCode())
中并关闭了firebug,或者在另一个没有打开控制台的浏览器中打开,那么你的浏览器会遇到javascript错误,如果您已将console.log(...)
行留在代码中了。
必须打开控制台窗口才能登录。
答案 2 :(得分:1)
您从传递给异步的函数的回调返回。您必须调整代码以进行回调并更改调用者以处理它异步的事实。
这意味着而不是:
// won't work
function checkSomething() {
someAsynchronousFunction(function(result) {
return result == "success";
});
}
if(checkSomething()) {
alert("It worked.");
}else{
alert("It didn't work.");
}
您必须将代码更改为:
function checkSomething(callback) {
someAsynchronousFunction(function(result) {
callback(result == "success");
});
}
checkSomething(function(result) {
if(result) {
alert("It worked.");
}else{
alert("It didn't work.");
}
});
答案 3 :(得分:0)
JQuery的getJSON()方法异步运行。你应该为checkDiscountCode()添加一个回调函数;回调函数将运行应用程序逻辑的其余部分。例如:
function sampleCallback(outputData) {
console.log('outputData = ' + outputData);
}
function checkDiscountCode(callback) {
$.getJSON( 'calc.php?code=' + discountCode, function( json ) {
// get output data, and then call callback.
callback(outputData);
});
}
checkDiscountCode(sampleCallback);
答案 4 :(得分:0)
如果discountCode.length > 2
你正在调用$.getJSON
函数,但它接受回调,并且不会立即返回任何内容。因此,在任何一种情况下,都会得到undefined
。