解决Angularjs中循环网络请求回调中值的调用问题

问题原型:

var data=[0,1,2,3];
for(var i=0;i<data.length;i++){}
	var myGeo = new BMap.Geocoder();
	var ar=data[i];
	myGeo.getPoint(ar,function(point,j){
		//此处是网络请求回调方法
		console.log(ar);//始终输出4
	});	
}

问题原因:

网络请求是异步执行方法,不会阻塞当前循环,以致回调执行时循环已经结束。


拟解决方案:

var data=[0,1,2,3];
var deferred = $q.defer();//参考API
var promise = deferred.promise;//参考API
//promise处理方法
var promiseFunc=function(one) {
	var ar=data[one];
	var myGeo = new BMap.Geocoder();
	//这是一个坑爹的方法,调用了网络API,可能造成回调的顺序不一致,甚至可能调用失败
	myGeo.getPoint(ar,function(point,j){
		//此处是网络请求回调方法
		console.log(ar);//正确输出
	});
	var anotherDeferred = $q.defer();//定义另一个promise,以达到当前方法顺利执行完之后再回调执行
	$timeout(function() {
	  anotherDeferred.resolve(one+1);//迭代加1进行数组读取
	}, 1000);//使用timeout以控制网络请求延迟
	return anotherDeferred.promise;//返回回调的promise
};

//循环迭代调用,构造promise.then().then().then()这样的链式结构
var tempFunc;
for(var i=0;i<data.length;i++)
{
	if(tempFunc){
		tempFunc=tempFunc.then(promiseFunc);
	}else{
		tempFunc=promise.then(promiseFunc);
	}
}
deferred.resolve(0);

参考链接: AngularJS 中的 Promise 和 设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值