JavaScript异步操作

本文探讨了JavaScript中处理异步操作的不同方法,通过具体实例对比了传统回调方式与现代CO模块及async/await语法的差异,并提供了实现代码。

1.问题的引出

先来看一段简单的代码:

function delayMsg(id){
    setTimeout(function(){
        return '序号:'+id;
    },2000);
}

function fetchData(){
    var arr = [1,2,3,4]
    var dataList = [];
    arr.forEach(function(id){
        var item = {
            msg:delayMsg(id)
        }
    });
    console.log(dataList);
}
fetchData();

delayMsg是一个异步操作,根据同步 -> 异步 -> 回调的先后顺序,明显打印结果dataList是空数组。
那么如何修改代码以在fetchData函数中获取正确数据呢?

2. 采用CO模块

var co = require('co');
function delayMsg (id){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve('序号:'+id);
        },3000);
    });
}

co(function *fectchData() {
    var dalaList = []
    for(var i=0;i<4;i++){
        var msg = yield delayMsg(i);
        dalaList.push({
            msg:msg
        });
    }        
    console.log(dalaList);
});

3. 采用async

const delayMsg = id =>{
    return new Promise((resolve,reject) => {
        setTimeout(function(){
            resolve('序号:' + id);
        },2000);
    })
}

async function fetchData(){
    var dataList = [];
    var arr = [1,2,3,4];
    for(val of arr){
        var item = {
            msg: await delayMsg(val)
        }
        dataList.push(item);
    }
    console.log(dataList);
}

据说比Promise好,采用ES7语法,使用前需要引入Babel模块

4.参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值