javascript - js中for循环中需要调用异步方法,怎么确保执行的顺序?
ringa_lee
ringa_lee 2017-04-10 16:53:04
[JavaScript讨论组]

在执行for循环的时候,如何执行完for循环,再执行for循环下面的代码;

    var obj = {},
        infoall = [];
   
       DBOrderTbAll(function(data){
             console.log(data);  
                if(data){
                       for(var i =0;i< data.length;i++){
                            var _tb = 'tb'+data[i];
                       
                            DBinfoList(_tb,function(data){
                                
                                 infoall.push(data);
                                 console.log(data);  
                            });    
                        
                       }
                         console.log(infoall);   
                        //callback(infoall);
                }
          }
      )    
  
ringa_lee
ringa_lee

ringa_lee

全部回复(5)
天蓬老师
var obj = {},
infoall = [];
   
DBOrderTbAll(function(data){
         console.log(data); 
        function processNext(copiedData){
            var _tb,data= copiedData.shift();
            if(data){
                _tb = 'tb'+ data;
                DBinfoList(_tb,function(data){
                     infoall.push(data);
                     console.log(data);
                     processNext(copiedData);  
                });
            }else{
                console.log(infoall);   
                 //callback(infoall);
            }
            
        }
        if(data){
             processNext(data.slice(0));
        }
  }) 
      
伊谢尔伦

如果DBinfoList里不涉及到XMLHttpRequest,建议把需要执行顺序的代码都放到DBinfoList的回调里执行。

巴扎黑

DBxxx 相关如果是异步操作的话,考虑一下 Promise

var KEY = 'tb';
var DB = new Promise(function(resolve, reject) {
    DBOrderTbAll(resolve);
});
    
// 过滤结果
function filter(raw) {
    return new Promise(function(resolve, reject) {
        raw ? resolve(raw) : reject();
    });
}

// 业务逻辑
function main(list) {
    return queen(list.map(formatter));
}

function formatter(item) {
    return new Promise(function(resolve, reject) {
        DBinfoList(key + item, resolve);
    });
}

// 异步事件数组
function queen(jobs) {
    return Promise.all(jobs);
}

function callback(res) {
    // res {Array} [{}, {}, {}...]
}

DB.then(filter).then(main).then(callback);
PHP中文网

用TJ的co:

var co = require('co');

co(function*() {
    var p = [],
        res = [];

    for (var i = 10; i > 0; i--) {
        (function(i) {
            p.push(new Promise(function(resolve) {
                setTimeout(function() { //异步逻辑
                    res.push(i);
                    resolve();
                }, 1000);
            }));
        })(i);

    }

    yield p;
    console.log(res); // [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]
});
巴扎黑

把异步代码放到setTimeout中

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号