Promise的使用

1.Promise出现的背景——回调地狱

我们在多次进行异步操作的时候会很难控制程序的进程,比如

fs.readFile(path1,'utf8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
});
fs.readFile(path2,'utf8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
});
fs.readFile(path3,'utf8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
});
fs.readFile(path4,'utf8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
});

在这种情况下我们就不可以很好的控制程序的进行,去使它按照我们预计的样子执行,这个时候我们可以使用回调函数来控制每一部分是按照我们预期的样子执行,但是回调函数过多会造成回调地狱,代码十分难看且难以维护,由此产生了promise。

2.Promise的基础使用

let fs=require('fs');
let p1=new Promise(function(resolve,reject){
    fs.readFile('./TuBoWen','utf8',function(err,data){
        if(err){
            reject(err);
        }else{
            resolve(data);
        }
    });
});
p1.then(
    //当promise异步操作成功执行的回调函数
    function(data){
        console.log(data);
    },
    //当promise异步操作执行失败的回调函数
    function(err){
        console.log('读取文件失败了',err);
    }
)

3.封装Promise

let fs=require('fs');
function PromiseAPI(filePath){
    return new Promise(function(resolve,reject){
        fs.readFile(filePath,'utf8',function(err,data){
            if(err){
                reject(err);
            }else{
                resolve(data);
            }
        });
    });
}
//尝试调用
PromiseAPI('./TuBoWen')
.then(function(data){
    console.log(data);
},
function(err){
    console.log(err);
})

4.用Promise封装Ajax

function PromiseAjax(url,callback){
    return new Promise(function(resolve,reject){
        let oReq=new XMLHttpRequest();
        //当请求加载成功之后要调用指定的函数
        oReq.onload=function(){
            callback&&callback(JSON.parse(oReq.responseText))
            resolve(JSON.parse(oReq.responseText));
        }
        oReq.onerror=function(){
            reject(err);
        }
        oReq.open("get",url,true);
        oReq.send();
    })
}

5.结合MongoDB数据库使用Promise

一个简单的需求,查看数据库中是否有符合的数据,如果有,那么就打印“用户已存在”,否则在数据库中加入该用户。

User.findOne({
    username:'TuBoWen'
})
.then(function(user){
    if(user){
        console.log('用户已存在')
    }else{
        return new User({
            username:'TuBoWen',
            password:'1376490336',
            email:'1376490336@qq.com'
        }).save()
    }
})
.then(function(ret){
})

 

### JavaScript 中 Promise 的基本用法 Promise 是一种处理异步操作的对象,它表示一个最终会完成或者失败的操作的结果。以下是关于如何使用 JavaScript 中的 `Promise` 的详细介绍: #### 创建 Promise 对象 通过调用 `new Promise()` 可以创建一个新的 Promise 实例。该构造函数接受一个执行器函数作为参数,此函数具有两个参数:`resolve` 和 `reject`。 ```javascript const myPromise = new Promise((resolve, reject) => { const isSuccess = true; // 假设这是某种条件判断 if (isSuccess) { resolve("成功"); // 改变状态为 fulfilled 并传递值 } else { reject("失败原因"); // 改变状态为 rejected 并传递错误信息 } }); ``` 上述代码展示了如何定义一个简单的 Promise[^1]。 #### 处理成功的回调 `.then()` 当 Promise 被解决(即变为 fulfilled 状态),可以使用 `.then()` 方法来获取其结果并执行相应的逻辑。 ```javascript myPromise.then((result) => { console.log(result); // 输出: 成功 }); ``` 这里说明了 `.then()` 如何捕获由 `resolve` 提供的数据。 #### 错误处理 `.catch()` 如果 Promise 遇到错误而被拒绝,则可以通过 `.catch()` 方法捕捉这些异常情况。 ```javascript myPromise.catch((error) => { console.error(error); // 如果有错误发生则打印出来 }); ``` 这部分解释了 `.catch()` 用来监听任何可能发生的错误事件。 #### 同时支持多个链式调用 `.then()` 返回的是另一个新的 promise,因此允许我们进行连续多次的方法调用形成链条结构。 ```javascript myPromise .then((data) => data.toUpperCase()) // 将字符串转成大写形式 .then((upperCasedData) => console.log(upperCasedData)) // 打印转换后的数据 .catch((err) => console.warn(err)); // 捕捉整个流程中的任意错误 ``` 以上例子演示了一个典型的多阶段异步任务流控制方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值