异步Javascript函数,不返回值

异步Javascript函数,不返回值,javascript,asynchronous,Javascript,Asynchronous,我遇到了一个让我头疼的问题。基本上是这样的情况: 我有一个callController()函数,它只是简单地使用jQuery.load()方法来加载控制器,加载后,我可以处理返回的参数 现在。。。在我的一个控制器中,我需要检查一个验证规则,以便允许用户执行某些功能,但是,我创建了一个如下函数: function myValRule() { var val = callController('blablabla'), response = ""; val.done(fun

我遇到了一个让我头疼的问题。基本上是这样的情况:

我有一个
callController()
函数,它只是简单地使用
jQuery.load()
方法来加载控制器,加载后,我可以处理返回的参数

现在。。。在我的一个控制器中,我需要检查一个验证规则,以便允许用户执行某些功能,但是,我创建了一个如下函数:

function myValRule() {

    var val = callController('blablabla'),
    response = "";
    val.done(function(data) {
        //my business logic
        response = something;
    }
    return response;

}
正如您所想象的,
response
,即使它有一个值,它也返回
未定义的
,因此我设置了一个超时和
console.log()
它现在有一个值,但即使我将返回放入
setTimeout()
中,我也无法返回这个值。因此,基本上,当方法调用此函数进行验证时,会发现它为空


你能告诉我一些解决这个问题的方法吗?

记住这是异步的!
返回响应.done()
时,code>早已消失

如果您需要以这种方式返回值,可以考虑在
myValRule
函数中提供回调函数(该函数将从
.done()
中调用),也可以考虑使用
$.Deferred
api来模拟
callController(…)
正在执行的操作

以下是两种情况的示例(示例调用
myValRule
):

回调参数 使用$.Deferred (我假设是jQuery,因为有一个.done调用)


我认为你完全误解了异步函数的概念。您似乎还有一个主要的语法错误。@andresmijares25:不在同一个“线程”中。您的完成回调在与返回不同的时间执行。而且,一旦你使用了回调(例如延迟/承诺/ajax),就没有真正的方法“重新加入”执行计划。你的回调建议成功了,非常感谢你花了很多时间。承诺方法似乎对OP没有吸引力,但仍然应该注意到这一点。最好使用合适的promise库,或者ES6 promises(如果有的话),我不了解reddit用户;只需发布原始文章链接,不要让我去reddit看到的只是一个标题,上面有指向我想要的实际内容的链接。(呃,它迫使你先去reddit;叹气)我不是reddit用户。如果你仔细看,你会发现我确实发布了原始文章链接,以及类似文章的链接,还有一个reddit页面,提供了一个方便的tl;第一篇文章的dr版本。此外,当向SO用户发送评论时,我建议像上面所做的那样,在评论前面加上
@username
,这样他们就会知道你对他们说了什么。:)
function myValRule(callback){
  var val = callController('blablabla'),
  val.done(function(data){
    var response = /* something */;
    callback(response);
  });
}
myValRule(function(response){
  // here you have response
});
function myValRule(){
  var df = $.Deferred(),
      val = callController('blablabla');
  val.done(function(data){
    var response = /*something */;
    df.resolve(response);
  }).fail(df.reject);
  return df.promise();
}
myValRule().done(function(response){
  // here you have response
});