V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wensonsmith
V2EX  ›  程序员

Javascript 异步赋值好蛋痛,大神看看怎么办

  •  
  •   wensonsmith ·
    wensonsmith · 2015-12-29 19:19:40 +08:00 · 3969 次点击
    这是一个创建于 3034 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用了 AngularJS 框架,

    var price = 0; 
    
     $http.get('http://XXXX.com/getPrice').success(function(res){
    
         price = res.price;
    
     })
    
    
     $scope.$on('echoPrice',function(){
    
        console.log(price);          //当别的 controller 广播 echoPrice 事件的时候
                                     // 这个 price 打印出来始终是 0
     })
    

    是有没有一种方法可以延时赋值,或者说是当收到别的 controller 的广播事件后,再取这个 price 的值 ?

    只能放到回调里面么? 感觉好蛋痛啊!!

    21 条回复    2015-12-30 11:24:04 +08:00
    Automan
        1
    Automan  
       2015-12-29 19:26:12 +08:00   ❤️ 1
    $scope.price= 0 ;
    console.log($scope.price);
    wensonsmith
        2
    wensonsmith  
    OP
       2015-12-29 19:30:47 +08:00
    @Automan 犀利!!!!

    大神牛逼~~ 这个原理是啥呀
    Automan
        3
    Automan  
       2015-12-29 19:31:59 +08:00
    @wensonsmith $scope 就是干这事儿的啊
    oubushixb
        4
    oubushixb  
       2015-12-29 19:33:20 +08:00
    可以选择直接在广播事件中传递 price..
    `$rootScope.$broadcast('echoPrice', price);

    $scope.$on('echoPrice', function (e,price){
    console.log(price);
    })`
    wensonsmith
        5
    wensonsmith  
    OP
       2015-12-29 19:37:37 +08:00
    @oubushixb 这条路想过,不过其他 controller 广播这个事件的时候取这个 price 太麻烦了
    wensonsmith
        6
    wensonsmith  
    OP
       2015-12-29 19:38:23 +08:00
    @Automan 为啥直接定义一个变量不行,$scope 就可以延时赋值, $scope 采用了啥黑科技
    FrankFang128
        7
    FrankFang128  
       2015-12-29 19:39:41 +08:00
    不知道有什么蛋疼的
    让异步的东西看起来像异步吧
    chairuosen
        8
    chairuosen  
       2015-12-29 19:43:31 +08:00
    我没看出 LZ 的问题问的啥,也没看出 1L 的回答回的啥。你们都看出来了?
    attker
        9
    attker  
       2015-12-29 19:48:46 +08:00 via iPhone
    一楼这是在讽刺吧, price 经过 0 秒后把 price 打印出来
    chairuosen
        10
    chairuosen  
       2015-12-29 19:49:56 +08:00
    LZ 是想在有人来问 price 的时候告诉他 price ,然后问后端 price 是异步的,所以想预加载一下么?把 promise 存下来在事件回调里接着 then 一下?
    oubushixb
        11
    oubushixb  
       2015-12-29 19:50:52 +08:00
    @wensonsmith 如果是多个 controller 想要共享变量的话,把 price 变量存到 servie 里才是最好的..

    详细可以看看 todd motto 的文章
    https://toddmotto.com/rethinking-angular-js-controllers/
    Automan
        12
    Automan  
       2015-12-29 19:57:17 +08:00
    和异步没关系。。这个问题是因为上下文。。
    bdbai
        13
    bdbai  
       2015-12-29 20:28:38 +08:00 via iPhone
    打开浏览器调试工具,分别在回调函数里面和下面下断点,然后跟着跑一遍。
    chemzqm
        14
    chemzqm  
       2015-12-29 20:48:52 +08:00
    是 Angular 蛋疼才对吧,正常逻辑应该应该是在回调里继续执行,这货非要让你用同步方式去写
    Biwood
        15
    Biwood  
       2015-12-29 21:46:38 +08:00
    1 楼的写法不就是 Angular.js 的精华么,这都不知道还用什么 Angular.js
    imdoge
        16
    imdoge  
       2015-12-29 23:09:05 +08:00
    $http.get 和 echoPrice 事件有关系的么,还是只初始化的$http.get 一次,那没理由是 0 啊
    如果有关系的话一般这样:
    在 factory (比如在 Service 服务的命名为'echoPrice'方法里) return $http.get('http://XXXX.com/getPrice');
    然后在 controller 里 Service.echoPrice().then(function(data){ $scope.price = data.data; });
    异步一般用 promise
    wensonsmith
        17
    wensonsmith  
    OP
       2015-12-30 09:07:03 +08:00
    @Biwood 不用不知道是精华啊~ 刚开始用 : D
    wensonsmith
        18
    wensonsmith  
    OP
       2015-12-30 09:08:11 +08:00
    @attker 不是,使用$scope.price 这个放在异步请求里, 下面的函数可以获取到异步回来的值了~
    wensonsmith
        19
    wensonsmith  
    OP
       2015-12-30 09:08:42 +08:00
    @FrankFang128 Promise 不是为了让异步不像异步?
    wizardoz
        20
    wizardoz  
       2015-12-30 09:29:48 +08:00
    感觉楼主是没搞清楚闭包。
    传递给“ echoPrice ”的是一个函数,当创建函数作为参数或者返回值的时候,闭包就创建了。
    FrankFang128
        21
    FrankFang128  
       2015-12-30 11:24:04 +08:00
    @wensonsmith Promise 还要要传回调啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   926 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:14 · PVG 06:14 · LAX 15:14 · JFK 18:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.