[js]promise學習2
阿新 • • 發佈:2018-10-15
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