Javascript异步返回值
正如我认为我理解JS范围一样 以这个代码为例:Javascript异步返回值,javascript,scope,Javascript,Scope,正如我认为我理解JS范围一样 以这个代码为例: function init() { var page; var pageName = $('body').data('page'); switch(pageName) { // (there are more switch cases here normally...) case 'pSearchLatest': requir
function init() {
var page;
var pageName = $('body').data('page');
switch(pageName) {
// (there are more switch cases here normally...)
case 'pSearchLatest':
require(['searchresults'], function (SearchResults) {
page = new SearchResults().init();
console.log(page); // <- shows the object!
});
default:
break;
}
console.log(page); // <- undefined
return page;
}
在我调用wrapping init()方法的页面中:
两个可能的原因。。。你与案件不符。或者,将值赋值给
页面
的回调尚未执行。我猜是后者,因为如果你的案例失败了,这一点很明显。查看您正在使用的AMD库的文档,了解传递给require
的函数的执行情况
一般来说,尽量避免返回由异步调用确定的值,如下所示。相反,使用某种观察者模式订阅可以从不同位置触发的特定事件。两个可能的原因。。。你与案件不符。或者,将值赋值给
页面
的回调尚未执行。我猜是后者,因为如果你的案例失败了,这一点很明显。查看您正在使用的AMD库的文档,了解传递给require
的函数的执行情况
一般来说,尽量避免返回由异步调用确定的值,如下所示。相反,使用某种观察者模式订阅可以从不同位置触发的特定事件。您确实正确理解了范围。该内部函数中的代码确实分配给外部范围中的变量 您不了解的是异步行为。
require
函数接受一个回调函数,该函数将在将来的某个时候(当请求的模块可用时)调用。但是,它确实会立即返回,并且控制流将导致console.log
语句,该语句会打印undefined
——这是页面
变量当时的值
您应该能够识别这一点,因为
未定义的首先被记录,回调中的log语句(带有对象)稍后执行,即使它在代码中位于上面。您确实正确理解了范围。该内部函数中的代码确实分配给外部范围中的变量
您不了解的是异步行为。require
函数接受一个回调函数,该函数将在将来的某个时候(当请求的模块可用时)调用。但是,它确实会立即返回,并且控制流将导致console.log
语句,该语句会打印undefined
——这是页面
变量当时的值
您应该能够认识到,由于先记录未定义的
,回调中的log语句(带有对象)稍后执行,即使它在代码中位于上面。require
是异步的,因此,您的函数确实先退出然后处理回调函数。require
是异步的,因此您的函数确实先退出然后处理回调函数。重复-,请阅读非常有用的问答。问题不是范围问题,而是时间问题。当底部日志运行时,回调尚未运行。对require
的回调在init
终止后最后运行。您希望它返回什么?require调用是异步的--请阅读非常有用的问答。问题不是范围问题,而是时间问题。当底部日志运行时,回调尚未运行。对require
的回调在init
终止后最后运行。您希望它返回什么?require调用当然是异步的!异步模块定义。嗯。谢谢,将在9分钟内接受:D.eurgh,如何使用init方法返回页面?我想我可以做一段时间(page==未定义)的事情,但那太恶心了,对吧?@AdamWaitewhile(page==未定义)
将无法工作,因为JS是单线程的。设置场景:您的回调正在等待触发时间,线程正在忙于循环。有一天,回收站着火了;它走到线程跟前,说“我现在准备好运行了!”线程说,“对不起,现在不行,我正忙于运行这个循环,检查页面
的值;完成后你可以运行。”回调请求道,“但是我是应该为你设置页面
的人!你根本不能安排我吗?”线程回答道,“对不起,规则就是规则!我想我会一直运行这个循环,然后!“哈哈,我习惯于用Objective-C和Ruby编写Javascript,所以Javascript总是让我有点吃惊:D。我想我已经破解了,请看我的更新。啊,当然!异步模块定义。Duh。谢谢,9分钟后会接受:D.eurgh,我如何用init方法返回页面?我想我可以做一会儿(页面==未定义)但是这很恶心,对吗?@AdamWaitewhile(page==undefined)
将不起作用,因为JS是单线程的。设置场景:你的回调正在等待启动时间,线程正在忙着循环。有一天,回调启动;它到达线程并说“我现在准备好运行了!”!线程说,“对不起,现在不行,我正忙着运行这个循环来检查页面的值。”;回调请求道,“但我是应该为你设置page
页面的人!”!你根本就不能安排我吗?”线程回答说,“对不起,规则就是规则!我想我会一直运行这个循环,然后!“哈哈,我习惯于用Objective-C和Ruby编写Javascript,所以Javascript总是让我有点吃惊:D。我想我已经破解了它,请看我的更新。
function init(callback) {
case 'pSearchLatest':
require(['searchresults'], function (SearchResults) {
page = new SearchResults().init();
callback(page)
});
}
new PageController().init(function(asyncViewController) {
App.view = asyncViewController;
});