Javascript返回不起作用?返回undefined

时间:2012-03-11 02:48:54

标签: jquery json function javascript

我的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());它说未定义..

任何人都可以帮助我吗?我没有看到这个问题..

提前致谢!

5 个答案:

答案 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