异步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
});