promise对象使用

promise对象使用


大量的异步操作,如果要顺序执行的话,则会形成回调地狱,通过promise对象,即可解决回调地狱。
以node为例,假设我们有一个需求
1.判断test.txt是否存在,不存在则输出错误
2.若存在则删除这个文件
3.写入一个新的文件
假如不用promise对象,代码如下

const fs=require('fs')
fs.stat('./test.txt',(err,states)=>{
    if(err){
        console.log(err)
    }else{
   		console.log("文件存在")
        fs.unlink('./test.txt',(err)=>{
            if(err){
                console.log(err)
            }else{
                console.log("文件删除成功")
                fs.writeFile('./test1.txt','HelloWorld',(err)=>{
                    if(err){
                        console.log(err)
                    }else{
                        console.log("新文件写入成功")
                        //若有更多的操作则继续在这写,形成回调地狱
                    }
                })
            }
        })
    }
})

当操作顺序执行的操作越多的时候,便会一直写回调,形成回调地狱。此时引入promise对象即可解决这个问题。
promise的构造函数中包含两个参数,resolve-成功之后的回调函数,reject-失败之后的回调函数。

const promise=new promise((resolve,reject)=>{
	if(/*异步操作成功*/){
		resolve()//可以传参,传入.then(msg)
	}else{
		reject()//可以传参,传入.then(err)
	}
})

当实例生成后,.then()指定resolve的回调函数,.catch指定reject的回调函数。
用promise对象重写上述例子

const fs = require('fs')
//将每个Promise对象封装成函数,返回Promise对象
//判断文件是否存在
function isExit() {
    return new Promise((resolve, reject) => {
        fs.stat('./test.txt', (err) => {
            if (err) {
                reject('err1')
            } else {
                resolve('文件存在')
            }
        })
    })
}

function deleteF() {
    return new Promise((resolve, reject) => {
        fs.unlink('./test.txt', (err) => {
            if (err) {
                reject('err2')
            } else {
                resolve('文件删除成功')
            }
        })
    })
}

function writeF() {
    return new Promise((resolve, reject) => {
        fs.writeFile('./test1.txt', 'HelloWorld', (err) => {
            if (err) {
                reject('err3')
            } else {
                resolve('新文件写入成功')
            }
        })
    })
}
//链式操作,所有错误共用一个catch
isExit()
    .then((msg) => {
        console.log(msg)
        return deleteF()
    })
    .then((msg) => {
        console.log(msg)
        return writeF()
    })
    .then((msg) => {
        console.log(msg)
    })
    .catch((err) => {
        console.log(err)
    })

若要中断链式操作,则抛出一个错误信息即可

isExit()
    .then((msg) => {
        console.log(msg)
        return deleteF()
    })
    .then((msg) => {
        console.log(msg)
        return writeF()
    })
    .then((msg) => {
        console.log(msg)
    })
    .then(()=>{
        console.log('这是多余的操作,但是要存在,下一个then不执行')
		//抛出错误信息中断下一个操作
        throw new Error('停止输出')
    })
    .then(()=>{
        console.log('看看我输出来了吗')
    })
    .catch((err) => {
        console.log(err)
    })

输出结果

文件存在
文件删除成功
新文件写入成功
这是多余的操作,但是要存在,下一个then不执行
Error: 停止输出
    at isExit.then.then.then.then
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值