let fs = require('fs');
function read(filename, encoding) {
return new Promise((resolve, reject) => {
fs.readFile(filename, "utf8", function(err, data) {
if(err) reject(err);
resolve(data);
})
})
}
// 最基础的使用
function jichu() {
// 同一个promise实例的状态不能变
read('./1.txt').then((data) => {
console.log(data);
}, (err) => {
console.log(err);
})
}
// jichu()
// 如果then成功或者失败的结果中,返回的还是一个promise,会等待这个promise的执行结果,并将结果传递到外层的then的下一个then中,作为下一个then的参数
function returnPromise() {
read('./2.txt').then((data) => {
// 正常值是下一个函数的onfullfilled函数处理
return 123
// ------return异常值或者抛出异常或者return一个失败的promise----------
// 这里返回了一个失败的promise,只能等下一个then的onReject函数来处理
// return read('./2.txt');
/**
* onFullFilled中的错误或者onFullFilled返回的错误也只能是下面的then来处理,而不是这个onFullFilled一起的onreject处理
throw new Error('error');
return new Error('error');
*/
}, (err) => {
// 这里注意:这里只能处理exector中的错误
// 这里注意,如果是一起的resolve返回的是一个promise,promise报错的话, 本次then是处理不了的,只能等下次then
console.log(`firErr:${err}`);
}).then(
(data) => {
console.log(`secThenData:${data}`);
},
// 第二个then处理
(err) => {
console.log(`secThenErr:${err}`);
}
)
}
function handleError() {
read('./2.txt').then((data) => {
console.log(`firdata:${err}`);
}, (err) => {
// executor函数报错,如果不抛出异常的话,先进入onReject函数,然后进入了第二个then的onFullfilled函数
// console.log(`firErr:${err}`);
// return 213
// 如果是return err的话会进入了第二个then的onFullfilled函数,只有throw err才会被下一个then的onReject函数处理
// return err
// 唯一一个让下面的then的onReject函数处理的方法throw err
// throw err
}).then(
// 然后进入了第二个then的onFullfilled函数
(data) => {
console.log(`secThenData:${data}`);
},
// 第二个then处理
(err) => {
console.log(`secThenErr:${err}`);
}
)
}
// handleError()
// 怎么终止一个promise呢?返回一个状态spending的promise
const stopPromise = () => {
read('./2.txt').then((data) => {
// executor不出错的情况下return 一个状态spending的promise
// return new Promise(() => {})
}, (err) => {
// executor出错的情况下return 一个状态spending的promise
return new Promise(() => {})
}).then(
(data) => {
console.log(`secThenData:${data}`);
},
(err) => {
console.log(`secThenErr:${err}`);
}
)
}
// stopPromise()
// 问题:只要报错了就能走到最后一个then的onReject吗?不是,如果在onReJect不抛出异常就不会