promise

101 阅读1分钟
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不抛出异常就不会