您的位置:首页 > 编程语言

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

2017-09-12 12:05 489 查看
//引入模块
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)
// })
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: