1. 程式人生 > >[js]promise學習2

[js]promise學習2

adf 運行 fun readfile throw 影響 turn 保存 ucc

let fs = require("fs"),
    path = require('path');

普通讀取文件方法

/*
fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});
console.log(111); //readFile是異步的,會先執行
*/
//將讀文件方法封裝成函數return(因為readFile是異步的,不能用return)
/*function readFile(fp) {
    fs.readFile(fp, 'utf8', (err, data) => {
        if (err) return err;
        return data;
    })
}

console.log(111);
console.log(readFile(path.resolve('./data.json'))); //undefined*/

利用回調解決獲取數據問題

/*function readFile(fp, callback) {
    fs.readFile(fp, 'utf8', (err, data) => {
        if (err) return callback(err);
        callback(null, data)
    })
}

readFile(path.resolve('./data.json'), (err, data) => {
    if (err) console.log(err.message);
    console.log(data)
});
console.log(111);*/

分開寫回調更明確點

/*function readFile2(fp, succCb, errCb) {
    fs.readFile(fp, 'utf8', (err, data) => {
        if (err) return errCb(err);
        succCb(data)
    });
}

readFile2(path.resolve('./data1.json'), function succCb(data) {
    console.log(data);
}, function errCb(err) {
    console.log('處理錯誤');
});

readFile2(path.resolve('./data.json'), function succCb(data) {
    console.log(data);
    readFile2(path.resolve('./data2.json'), function succCb(data) {
        console.log(data);
        readFile2(path.resolve('./data3.json'), function succCb(data) {
            console.log(data);
        });
    });
});*/

使用promise實現讀文件

/*
var p = new Promise(function () {
    fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
        if (err) return err;
        console.log(data);
    })
});

//特點, new後立即執行excutor
*/

如何不讓立即執行: 放到函數裏

/*function readFile() {
    var p = new Promise(function () {
        fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
            if (err) throw err;
            console.log(data); //如何獲取數據: 異步操作不能return
        })
    });
}

console.log(111);
readFile();
console.log(222);*/

使用promise的reject和resolve返回數據

/*
function readFile() {
    var promise = new Promise(function (resolve, reject) {
        fs.readFile(path.resolve('./data1.json'), 'utf8', (err, data) => {
            if (err) return reject(err);
            resolve(data); //如何獲取數據: 異步操作不能return
        })
    });
    return promise; //1,返回時var promise還並沒有只系那個
}

var p = readFile();
p.then(function (data) { //2,直到.then實例化了具體的resolve, reject函數後, 才去執行的var promise的內容.
    console.log(data);
}, function (err) {
    console.log(err);

});

*/
//優化
//1.取消return中間變量
//2.調用tehn時候不必中間變量
/*
function readFile() {
    return new Promise(function (resolve, reject) {
        fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
            if (err) return reject(err);
            resolve(data); //如何獲取數據: 異步操作不能return
        })
    });
    //1,返回時var promise還並沒有只系那個
}


readFile().then(function (data) { //2,直到.then實例化了具體的resolve, reject函數後, 才去執行的var promise的內容.
    console.log(data);
}, function (err) {
    console.log(err);
});
*/
function readFile(fp) {
    return new Promise(function (resolve, reject) {
        fs.readFile(path.resolve(fp), 'utf8', (err, data) => {
            if (err) return reject(err);
            resolve(data); //如何獲取數據: 異步操作不能return
        })
    })
}

/*
readFile('data.json').then(function (data) {
    console.log(data);
    readFile('data2.json').then(function (data) {
        console.log(data);
        readFile('data3.json').then(function (data) {
            console.log(data);
        });
    });
});*/
/*
readFile('data.json').then(function (data) {
    console.log(data);
    11
    return readFile('data2.json'); //返回新的promise, 本次返回的promise對象, 被第二個.then()操作
}).then(function (data) {
    console.log(data);
    return readFile('data3.json');
}).then(function (data) {
    console.log(data);
});

console.log(111);*/

默認情況,前面的promise錯誤,即終止promise, 後面的then不會執行

情況1: 使用錯誤的回調解決這個問題: 前面執行失敗了,不要印象後續promise正常運行.

/*
readFile('data11.json').then(function (data) {
    console.log(data);
    return readFile('data2.json'); //返回新的promise, 本次返回的promise對象, 被第二個.then()操作
}, function (err) {
    console.log('失敗1');
    return readFile('data2.json'); //返回新的promise,避免影響下一個
}).then(function (data) {
    console.log(data);
    return readFile('data3.json');
}, function (err) {
    console.log('失敗2');
    return readFile('data3.json');
}).then(function (data) {
    console.log(data);
}, function (err) {
    console.log('失敗3');
});

console.log(111);
*/

情況2: 如果後面的promise依賴於前面的promise執行結果, 前面錯了,後面就不必執行了

//一旦保存,立即終止所有promise執行

// cache的作用,如果前面的任何一個promise執行失敗,則立即終止執行, 並進入cahce處理異常.
readFile('data.json').then(function (data) {
    console.log(data);
    11
    return readFile('data22.json'); //返回新的promise, 本次返回的promise對象, 被第二個.then()操作
}).then(function (data) {
    console.log(data);
    return readFile('data3.json');
}).then(function (data) {
    console.log(data);
}).catch(function (err) { //有1個錯誤,立即終止promise,2.進入cache處理
    console.log('自己的輸出', err);
});

console.log(111);

[js]promise學習2