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

2015-12-29 19:19:40 +08:00
 wensonsmith

用了 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 的值 ?

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

3986 次点击
所在节点    程序员
21 条回复
Automan
2015-12-29 19:26:12 +08:00
$scope.price= 0 ;
console.log($scope.price);
wensonsmith
2015-12-29 19:30:47 +08:00
@Automan 犀利!!!!

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

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

详细可以看看 todd motto 的文章
https://toddmotto.com/rethinking-angular-js-controllers/
Automan
2015-12-29 19:57:17 +08:00
和异步没关系。。这个问题是因为上下文。。
bdbai
2015-12-29 20:28:38 +08:00
打开浏览器调试工具,分别在回调函数里面和下面下断点,然后跟着跑一遍。
chemzqm
2015-12-29 20:48:52 +08:00
是 Angular 蛋疼才对吧,正常逻辑应该应该是在回调里继续执行,这货非要让你用同步方式去写
Biwood
2015-12-29 21:46:38 +08:00
1 楼的写法不就是 Angular.js 的精华么,这都不知道还用什么 Angular.js
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
2015-12-30 09:07:03 +08:00
@Biwood 不用不知道是精华啊~ 刚开始用 : D
wensonsmith
2015-12-30 09:08:11 +08:00
@attker 不是,使用$scope.price 这个放在异步请求里, 下面的函数可以获取到异步回来的值了~
wensonsmith
2015-12-30 09:08:42 +08:00
@FrankFang128 Promise 不是为了让异步不像异步?
wizardoz
2015-12-30 09:29:48 +08:00
感觉楼主是没搞清楚闭包。
传递给“ echoPrice ”的是一个函数,当创建函数作为参数或者返回值的时候,闭包就创建了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/247010

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX