• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wensonsmith
V2EX  ›  程序员

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

  •  
  •   wensonsmith ·
    wensonsmith · Dec 29, 2015 · 5265 views
    This topic created in 3964 days ago, the information mentioned may be changed or developed.

    用了 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 replies  •  2015-12-30 11:24:04 +08:00
    Automan
    Automan
    Dec 29, 2015❤️1
    1
    $scope.price= 0 ;
    console.log($scope.price);
    wensonsmith
    wensonsmith
    OP
    Dec 29, 2015
    2
    @Automan 犀利!!!!

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

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

    详细可以看看 todd motto 的文章
    https://toddmotto.com/rethinking-angular-js-controllers/
    Automan
    Automan
    Dec 29, 2015
    12
    和异步没关系。。这个问题是因为上下文。。
    bdbai
    bdbai
    Dec 29, 2015 via iPhone
    13
    打开浏览器调试工具,分别在回调函数里面和下面下断点,然后跟着跑一遍。
    chemzqm
    chemzqm
    Dec 29, 2015
    14
    是 Angular 蛋疼才对吧,正常逻辑应该应该是在回调里继续执行,这货非要让你用同步方式去写
    Biwood
    Biwood
    Dec 29, 2015
    15
    1 楼的写法不就是 Angular.js 的精华么,这都不知道还用什么 Angular.js
    imdoge
    imdoge
    Dec 29, 2015
    16
    $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
    wensonsmith
    OP
    Dec 30, 2015
    17
    @Biwood 不用不知道是精华啊~ 刚开始用 : D
    wensonsmith
    wensonsmith
    OP
    Dec 30, 2015
    18
    @attker 不是,使用$scope.price 这个放在异步请求里, 下面的函数可以获取到异步回来的值了~
    wensonsmith
    wensonsmith
    OP
    Dec 30, 2015
    19
    @FrankFang128 Promise 不是为了让异步不像异步?
    wizardoz
    wizardoz
    Dec 30, 2015
    20
    感觉楼主是没搞清楚闭包。
    传递给“ echoPrice ”的是一个函数,当创建函数作为参数或者返回值的时候,闭包就创建了。
    FrankFang128
    FrankFang128
    Dec 30, 2015
    21
    @wensonsmith Promise 还要要传回调啊
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1930 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 16:33 · PVG 00:33 · LAX 08:33 · JFK 11:33
    ♥ Do have faith in what you're doing.