循环异步代码处理

let info = [ '北京', '上海', '香港', '日本', '纽约', '韩国'];
// 方案一 递归完成所有的数据遍历计算,且保证了执行的顺序
let milkCount = 0;
let finish = new Subject<any>();
function computeMilk (i) {
    if ( i<2 ) {
        // 同步
        milkCount = milkCount + 1;
        if (i < info.length - 1){
            computeMilk(i+1);
        } else { // 结束后返回一个标志
            return { milkCount: milkCount};;
        }
    } else {
        // 异步
        setTimeout(() => {
            milkCount = milkCount + i;
            if (i < info.length - 1){
                computeMilk(i+1);
            } else {
                finish.next('finish');
            }
        }, 1000);
    }
    
}
const result = computeMilk(0); 
if(typeof (result) === "object" && result.milkCount) { // 同步执行完毕

} else { // 异步执行完毕
    result.subscribe(result => {
    });
}
// 方案二 循环完成所有的数据遍历计算,结束后执行回调函数
function search(cb){
    let milkCount = 0;
    let j = 0;
    for (var i = 0; i< info.length; i++) {
        if ( i<2 ) {
            // 同步
            milkCount = milkCount + 1;
            j = j + 1;
            if (j === info.length ){ // 所有的都循环完毕
                cb(milkCount)
            }
        } else {
            // 异步
            setTimeout(() => {
                milkCount = milkCount + i;
                j = j + 1;
                if (j === info.length ){ // 所有的都循环完毕
                    // return milkCount;
                    cb(milkCount)
                }
            }, 1000);
        }
    }
    return 0;
}
function callback(e) {
    console.log(e)
}
原文地址:https://www.cnblogs.com/xiaolongzi/p/12358175.html