Javascript异步返回值

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

正如我认为我理解JS范围一样

以这个代码为例:

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==未定义)的事情,但那太恶心了,对吧?@AdamWaite
while(page==未定义)
将无法工作,因为JS是单线程的。设置场景:您的回调正在等待触发时间,线程正在忙于循环。有一天,回收站着火了;它走到线程跟前,说“我现在准备好运行了!”线程说,“对不起,现在不行,我正忙于运行这个循环,检查
页面
的值;完成后你可以运行。”回调请求道,“但是我是应该为你设置
页面
的人!你根本不能安排我吗?”线程回答道,“对不起,规则就是规则!我想我会一直运行这个循环,然后!“哈哈,我习惯于用Objective-C和Ruby编写Javascript,所以Javascript总是让我有点吃惊:D。我想我已经破解了,请看我的更新。啊,当然!异步模块定义。Duh。谢谢,9分钟后会接受:D.eurgh,我如何用init方法返回页面?我想我可以做一会儿(页面==未定义)但是这很恶心,对吗?@AdamWaite
while(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;
});