问题原型:
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 和 设计模式