首页 > 遍历异步获取数据添加到数组里后怎么才能使用上

遍历异步获取数据添加到数组里后怎么才能使用上

var newArr = [];
for(i in arr){
    用arr[i]异步获取到对应的数据data
    newArr.push(data);
}
想要使用newArr,
alert(newArr.length)结果为0,
除了setTimeout之外还有更好的办法吗?

http://.com/q/1010000004169937?utm_source=APP&utm_medium=iOS&utm_campaign=socialShare


异步并发

function myLogicFun(arr,allDoneCallback){
    var i, newArr=[],totalItemLength=arr.length;
    
    function watcher(resultData){
        newArr.push(resultData);
        if(newArr.length===totalItemLength){
            //all done
            allDoneCallback(newArr);
        }
    }
    
    for(i=0;i< totalItemLength;i++){
        (function(item){
            //do your business
            watcher(resultData);
        }(arr[i]));
    }
   
}

var arr=[....];
myLogicFun(arr,function(resultDaas){
    console.log(resultDaas)
});

或者异步顺序

function myLogicFun(arr,allDoneCallback){
    var arrtmp=arr.slice(0);
    var newArr=[];
    function doNext(){
        var someItem= arrtmp.shift();
        if(someItem){
            doAsync(function(resultData){
                newArr.push(resultData);
                doNext();
            });
        }else{
            //all done
            allDoneCallback(newArr);
        }
    }
    
    doNext();
    
}

var arr=[....];
myLogicFun(arr,function(resultDaas){
    console.log(resultDaas)
});

我再提供一个用Promise的解决方案:

// 这是你请求数据的方法,注意我是用steTimeout模拟的
function fetchData(req) {
    return new Promise(function(resolve) {
        setTimeout((function() {
                resovle('resp: ' + (+new Date));
        }, 1000);
    });
}

var arr = [1, 2, 3, 4];

// 用数组里面的元素做请求,去获取响应数据
var promiseArr = arr.map((function(req) {
        return fetch(req);
);

Promise.all(promiseArr).then(function(respDataArr) {
    // 在这里使用最终的数据
    console.log(respDataArr);
});

题主,我用手机敲了这么多代码,你不给我一个赞怎么行啊?:)

【热门文章】
【热门文章】