es6异步编程 Promise 讲解 --------各个优点缺点总结

//引入模块
let fs=require('fs');
//异步读文件方法,但是同步执行

function read(url) {
    //new Promise 需要传入一个executor 执行器
    //executor需要传入两个函数 resolve reject
    return new Promise((resolve,reject)=>{
        fs.readFile(url,'utf8',function (err,data) {
                if(err){
                    reject(err)
                }else{
                    resolve(data);
                }
        })
    })
};

//缺点 套了一个promise,而且捕获了2次,这两个请求没有依赖关系,时间叠加了
// read('./name.txt').then((data)=>{
//     let obj={};
//     obj.name=data;
//     read('./age.txt').then((data)=>{
//         obj.age=data;
//         console.log(obj);
//     },(err)=>{
//         console.log(err);
//     })
//
// }, (err)=>{
//     console.log(err);
// });



//回调地狱 链式调用
//相对好点的方法,同步两个异步依次执行 异常用catch捕获
// let obj={};
// read('./name.txt').then((data)=>{
//     obj.name=data;
//     return read('./age.txt')
//     }).then((data)=>{ //如果promise返回promise可以继续then
//     obj.age=data;
//    return obj //将结果向下继续传递
// }).then((data)=>{
//     console.log(data) //单独处理结果
// }).catch((err)=>{
//     console.log(err)
// });



//all方法是promise是类上自带的方法,并发读取,失败一个都失败了,时间只是一个读取的时间
//第一个参数 传递的是数组,数组装的是一个个promise对象
//调用后会再次返回一个promise实例
//最好的写法
Promise.all([read('./name.txt'),read('./age.txt')]).then(([name,age])=>{
//data就是promise执行成功的结果类型是数组
    console.log({name,age});
}).catch((err)=>{
    console.log(err)
})






//race如果一个失败了,都失败,如果一个成功了都成功,很少用
// Promise.race([read('./name.txt'),read('./age1.txt')]).then((data)=>{
// //data就是promise执行成功的结果类型是数组
//     console.log(data);
// }).catch((err)=>{
//     console.log(err)
// })

 

posted @ 2017-09-12 12:05  八bug哥哥  阅读(2680)  评论(0编辑  收藏  举报