promise笔记
以下笔记主要参考axios官网里的promise教程
写在这里方便以后复习或者查找
Promise (javascript.info)可以通过这个链接进行学习,更加详细
1.介绍
promise用于处理一些需要花费长时间的任务,进行异步处理,防止任务阻塞。一般是说解决了回调地狱的问题。
1.“生产者代码(producing code)”会做一些事儿,并且会需要一些时间。例如,通过网络加载数据的代码。它就像一位“歌手”。
2.“消费者代码(consuming code)”想要在“生产者代码”完成工作的第一时间就能获得其工作成果。许多函数可能都需要这个结果。就像粉丝
3.Promise 是将“生产者代码”和“消费者代码”连接在一起的一个特殊的 JavaScript 对象,在生产者处理结束后及时回馈给消费者
2.基本语法
Promise构造器
let promise = new Promise(function(resolve, reject) {
// executor(生产者代码,“歌手”)
});
当new promise被创建时,excutor会自动调用,相当于产出结果的生产者代码
excutor有了结果之后会进行回调
-
resolve(value)
—— 如果任务成功完成并带有结果 value
。
-
reject(error)
—— 如果出现了 error,error
即为 error 对象。
由 new Promise
构造器返回的 promise
对象具有以下内部属性:
-
state
—— 最初是 "pending"
,然后在 resolve
被调用时变为 "fulfilled"
,或者在 reject
被调用时变为 "rejected"
。
-
result
—— 最初是 undefined
,然后在 resolve(value)
被调用时变为 value
,或者在 reject(error)
被调用时变为 error
。
3.promise具体实例(生产者)
运行完成的例子:
let promise = new Promise(function(resolve, reject) {
// 当 promise 被构造完成时,自动执行此函数
// 1 秒后发出工作已经被完成的信号,并带有结果 "done"
setTimeout(() => resolve("done"), 1000);
});
![在这里插入图片描述](https://img-blog.csdnimg.cn/a8b1ad241a5f4106aff59b261e9676f6.png#pic_center)
运行未完成的例子:
let promise = new Promise(function(resolve, reject) {
// 1 秒后发出工作已经被完成的信号,并带有 error
setTimeout(() => reject(new Error("Whoops!")), 1000);
});
![在这里插入图片描述](https://img-blog.csdnimg.cn/ba7267b8792c483bb502516e10f01cf3.png#pic_center)
注意:
1.executor只能调用一个resolve或者一个reject函数
2.调用resolve或者reject时只能传入一个参数
Promise 对象的 state
和 result
属性都是内部的。我们无法直接访问它们。但我们可以对它们使用 .then
/.catch
/.finally
方法。
4.then,catch(消费者)
promise.then(
function(result) { /* handle a successful result */ },
function(error) { /* handle an error */ }
);
.then函数有两个参数,运行成功时和运行有错时
比如运行成功时:
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve("done!"), 1000);
});
// resolve 运行 .then 中的第一个函数
promise.then(
result => alert(result), // 1 秒后显示 "done!"
error => alert(error) // 不运行
);
运行失败时:
let promise = new Promise(function(resolve, reject) {
setTimeout(() => reject(new Error("Whoops!")), 1000);
});
// reject 运行 .then 中的第二个函数
promise.then(
result => alert(result), // 不运行
error => alert(error) // 1 秒后显示 "Error: Whoops!"
);
如果只要运行成功的参数,只写一个函数就行
如果只要运行出错的参数,可以.then(null, errorHandlingFunction)或者.catch(errorHandlingFunction)
比如:
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("Whoops!")), 1000);
});
// .catch(f) 与 promise.then(null, f) 一样
promise.catch(alert); // 1 秒后显示 "Error: Whoops!"
5.finally
无论运行成功或者失败,都会调用finally函数,进行收尾工作
比如:
new Promise((resolve, reject) => {
/* 做一些需要时间的事儿,之后调用可能会 resolve 也可能会 reject */
})
// 在 promise 为 settled 时运行,无论成功与否
.finally(() => stop loading indicator)
// 所以,加载指示器(loading indicator)始终会在我们继续之前停止
.then(result => show result, err => show error)
finally是进行常规的清理工作,所以不会接收参数,也不返回值
它可以比resolve/reject先执行
new Promise((resolve, reject) => {
setTimeout(() => resolve("value"), 2000)
})
.finally(() => alert("Promise ready")) // 先触发
.then(result => alert(result)); // <-- .then 显示 "value"
new Promise((resolve, reject) => {
throw new Error("error");
})
.finally(() => alert("Promise ready")) // 先触发
.catch(err => alert(err)); // <-- .catch 显示这个 error
6.总结
在学习axios时,顺便浅浅地学了一点promise
对网络请求有了更深一步的理解