Javascript异步返回值

时间:2013-06-05 18:38:01

标签: javascript scope

正如我以为我理解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;

}

查看控制台日志评论。当undefined被声明在switch语句的范围之外时,为什么第二个返回var page

修改

所以我错误地认为这是一个范围问题,但这取决于AMD的异步性质。

如果没有while循环检查undefined,如何在同一方法中返回require范围中的page值?

编辑2

我是这样做的:

function init(callback) {

   case 'pSearchLatest':
      require(['searchresults'], function (SearchResults) {
          page = new SearchResults().init();
          callback(page)
      });
}

并在我的页面中调用包装init()方法:

new PageController().init(function(asyncViewController) {
   App.view = asyncViewController;
});

3 个答案:

答案 0 :(得分:3)

您确实正确理解了范围。该内部函数中的代码确实分配给外部作用域中的变量。

您不理解的是异步行为。 require函数采用一个回调函数,将来会在所请求的模块可用时调用。然而,它立即返回并且控制流将导致console.log语句,其打印undefined - 这是page变量当时具有的值

您应该能够识别出,因为undefined首先记录 ,并且回调中的日志语句(带有对象)稍后执行 ,即使它在代码中出现。

答案 1 :(得分:2)

require是异步的,因此你的函数先退出然后处理回调函数。

答案 2 :(得分:1)

两个可能的原因......你没有匹配案例。或者还没有执行将值赋值给page的回调。我猜它是后者,因为如果你case失败将是显而易见的。查看您正在使用的任何AMD库的文档,并查看如何执行传递给require的函数。

同样作为一般规则尝试避免返回由此类异步调用确定的值。而是使用某种Observer模式来订阅可以从不同位置触发的特定事件。