前端面试题

Promise

2020-06-07  本文已影响0人  阿毛啊726

promise作用:为了解决回调地狱问题,但并不能减少代码量,将多次的嵌套变成并联
1)Promise是一个构造函数,可以new Promise
2)在promise中有两个函数 resolve和reject 成功和失败之后的回调函数
3)在promise的prototype中有一个.then方法,只要是promise构造函数创建的实例,都可以访问到 .then方法
4)如果promise表示一个异步操作,每当new一个promise实例,这个实例,就表示一个具体的异步操作;
5)既然promise创建的实例是一个异步操作,那么这个操作的结果只有两种
5.1成功:需要在内部调用 成功的回调函数 resolve
5.2失败:需要在内部调用 失败的回调函数 reject
5.3由于是异步操作,所以内部拿到操作的结果后是无法使用return把操作的结果返回给调用者,需要使用回调函数返回给调用者
6)可以在new出来的promise实例上调用.then方法,预先为promise异步操作指定成功和失败的回调函数

此时只知道这是一个异步,但不知道是什么的异步

var promise=new Promise

此时知道了异步操作是什么,异步操作是通过function定义的

var promise=new Promise(function () {
    fs.readFile("2","utf8",(err,data)=>{
        if(err) throw err
        console.log(data);
    })
})

当new一个对象时,就会立即执里面的异步操作回调函数
为了不立即执行,把new对象的过程放在函数里,调用函数的时候,才会执行异步操作

function getfile(){
    var promise=new Promise(function () {
        fs.readFile("2","utf8",(err,data)=>{
            if(err) throw err
            console.log(data);
        })
    })
}

用函数包装起来,用的时候调用函数,此时执行里面的回调函数,不调用时,不执行
带来的问题,因为是个异步操作,所以不会有返回内容,为了有返回,引入resolve和reject

function getfile(){
    var promise=new Promise(function (resolve, reject) {
        fs.readFile("2","utf8",(err,data)=>{
            if(err) reject(err)
            resolve(data)
        })
    })
    return promise
}

var p=getfile() //这里得到了方法中的promise (因为函数返回的是promise)但是里面的函数是异步函数,所以不执行
//先执行个return
//得到promise实例,调用then方法,规定reject和resolve
//下面这句话就是把 resolve和reject具体化

p.then(function (data) {
    console.log(data + "~~~~");
},function (err) {
    console.log(err.message);
})

执行顺序

1 定义函数
2 执行getfile()方法
3 运行函数 函数中new promise
4 return promise
5 接收这个return
6 用then定义resolve和reject
7 进行异步操作代码

function getfile(){
    return  promise=new Promise(function (resolve, reject) {
        fs.readFile("2","utf8",(err,data)=>{
            if(err) reject(err)
            resolve(data)
        })
    })
}
getfile() .then(function (data) {
    console.log(data + "~~~~");
},function (err) {
    console.log(err.message);
})

promise解决地狱回调,

getfile("1")
    .then(function (data) {
    console.log(data);

    return   getfile("2")
})
.then(function (data) {
    console.log(data);
    return getfile("3")
})
.then(function (data) {
    console.log(data);
})

对于执行顺序

getfile("1")
    .then(function (data) {
    console.log(data);

    return   getfile("2")
})
.then(function (data) {
    console.log(data);

    return getfile("3")

})
.then(function (data) {
    console.log(data);
})
console.log("~~~~~~");

结果
~~~~~~
111111111
2222222222
33333333333
因为最后一句是主程序中的,其他三个是异步操作,主程序先不执行

需求:遇到err的promise,继续执行下面的promise,不影响后面的promise
方法:添加reject函数,函数中return 下一个promise

getfile("11")
    .then(function (data) {
    console.log(data);
    return   getfile("2")  //这里其实已经生成了一个对应 2 的promise对象,我们用return把它拿出来
},function (err) {
        console.log("失败" + err.message); //这里失败了,但是下面的内容还要执行,所有return 2 
        return   getfile("2")
    })
.then(function (data) {
    console.log(data);
    return getfile("3")
})
.then(function (data) {
    console.log(data);
})
console.log("~~~~~~");

需求:每一层promise之间是依赖关系,一个promise err 其余的都不执行
方法:不是添加reject函数,在最后添加catch函数

getfile("11")
    .then(function (data) {
    console.log(data);
    return   getfile("2")  //这里其实已经生成了一个对应 2 的promise对象,我们用return把它拿出来
})
.then(function (data) {
    console.log(data);
    return getfile("3")
})
.then(function (data) {
    console.log(data);
}).catch(function (err) {
    console.log(err.message);
})

catch的作用:如果前面任何promise失败,则立即终止后面的promise,立马进入catch去处理promise中抛出的异常

上一篇下一篇

猜你喜欢

热点阅读