1. 程式人生 > >es6裡面處理多層回撥的多種方法及其缺點

es6裡面處理多層回撥的多種方法及其缺點

const fs = require('fs');


//第一種的常用的回撥函式,本身沒有什麼問題,但是問題是出現多個回撥函式的巢狀式時,會形成回撥地獄,既不利於讀也不利於管理
function fn() {
    fs.readFile('./req.html',(err,data)=>{
        if(err){
            return err;
        }else{
            console.log(data.toString());
            fs.readFile('./req.js',(err,data)=>{
                if(err){
                    return err;
                }else{
                    console.log(data.toString());
                }
            })
            // return data;
        }
    })
}

fn();

//第二種用promise處理的非同步回撥,他只是回撥的改進的寫法,最大的問題就是程式碼冗餘問題,加入then使得語義變得不清楚
function readFile(url) {
    return new Promise((resolve,reject)=>{
        fs.readFile(url,(err,data)=>{
            if(err) reject(err);
            else{
                resolve(data.toString());
            }
        })
    })

}

readFile("./req.html").then(data=>{
    console.log(data);
    return readFile("./req.js");
}).catch(err=>{
    console.log(err);
}).then(data=>{
    console.log(data);
}).catch(err=>{
    console.log(err);
});

//第三種方法:generator處理回撥的方法
function generatorFile(url) {
    fs.readFile(url,(err,data)=>{
        if(err) return err;
        else{
            console.log(data.toString());
            gen.next();
        }
    })
}

function* generatorRead() {
    yield generatorFile('./req.html');
    yield generatorFile('./req.js');
}

var gen = generatorRead();
gen.next();