Javascript 异步赋值好蛋痛,大神看看怎么办 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
wensonsmith
V2EX    程序员

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

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

    用了 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     Solana     5767 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 02:14 PVG 10:14 LAX 18:14 JFK 21:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86