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)
// })

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM