ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

promise

2021-07-13 18:31:29  阅读:198  来源: 互联网

标签:异步 resolve Promise reject promise pending


promise的三个状态: pending(默认) fulfilled(成功) rejected(失败)

  1. resolve函数被执行时, 会将promise的状态从 pending 改成 fulfilled 成功
  2. reject函数被执行时, 会将promise的状态从pending 改成 rejected 失败

Promise.reject()

new Promise((resolve, reject) => {
	reject()
})

Promise.resolve()

new Promise((resolve, reject) => {
	resolve()
})

Promise.all([promise1, promise2, promise3]) 等待原则, 是在所有promise都完成后执行, 可以用于处理一些并发的任务

// 后面的.then中配置的函数, 是在前面的所有promise都完成后执行, 可以用于处理一些并发的任务
Promise.all([promise1, promise2, promise3]).then((values) => {
  // values 是一个数组, 会收集前面promise的结果 values[0] => promise1的成功的结果
})

Promise.race([promise1, promise2, promise3]) 赛跑, 竞速原则, 只要三个promise中有一个满足条件, 就会执行.then(用的较少)

Promise
处理异步请求的
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列

resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

promise有三个状态:
1、pending[待定]初始状态
2、fulfilled[实现]操作成功
3、rejected[被否决]操作失败

Promise对象的状态改变,只有两种可能:
从pending变为fulfilled
从pending变为rejected。
这两种情况只要发生,状态就凝固了,不会再变了。

.then()
1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行

错误处理两种做法
第一种:reject(‘错误信息’).then(() => {}, () => {错误处理逻辑})
第二种:throw new Error(‘错误信息’).catch( () => {错误处理逻辑})
推荐使用第二种方式,更加清晰好读,并且可以捕获前面所有的错误(可以捕获N个then回调错误)

Promise.all() 批量执行
Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果

Promise.race() 类似于Promise.all() ,区别在于它有任意一个完成就算完成

Promise是异步编程的一种解决方案,将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
promise实际上解决jquery的ajax回调地域(解决层层嵌套),
只是异步编程的一种解决方案
三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)
Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调

promise 缺点: 无法取消promise,如果不设置回调函数,promise内部抛出错误 第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

axios是一个基于Promise的方法,可以发送get、post等请求,并且前后端都可以使用。
axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端

promise是异步编程的一种解决方案,它出现的初衷是为了解决回调地狱的问题。

new Promise((resolve, reject)=> {
    if('some option') {
        resolve('some value');
    } else {
        reject('some error');
    }
}).then(
    val=> {
        // ...
    },
    error=> {
        // ...
    }
)

Promise.prototype.then
当Promise中的状态(pending —> resolved or rejected)发生变化时才会执行then方法。

Promise.resolve()
除了通过new Promise()的方式,我们还有两种创建Promise对象的方法,Promise.resolve()相当于创建了一个立即resolve的对象

Promise.reject()
和Promise.resolve()类似,只不过一个是触发成功的回调,一个是触发失败的回调

Promise.all()全部完成(resolved)”或参数中不包含 promise 时回调完成(resolve);
如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果

Promise.race()方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。

1、promise 有 3 种状态:pending(进行中)、fulfilled(已完成,又称为Resolved) 或 rejected(已失败)。状态改变只能是 pending->fulfilled 或者 pending->rejected,状态一旦改变则不能再变。
2、new promise实例,要return
3、new promise时要传入函数,函数有resolve、reject两个参数
4、成功时执行resolve(),失败时执行reject()
5、then监听结果

Promise.all() 全部完成返回全部值的数组,其中有一个失败,返回第一个失败
Promise.race() 和all类似,区别是一个成功就是成功,一个失败就是失败了

手写一个promise

var promise = new Promise((resolve, reject) => {
	if (操作成功) {
		resolve(value);
	} else {
		retject(error);
	}
});
promise.then(function(value) {
	// success
}, function(value) {
	// failure
})

基于promise的async 和await的区别
async用于函数声明,表示声明的函数为一个异步函数,这个函数返回一个Promise对象(resolve);
await:表示在这里等待promise返回结果,(resolve返回)
await必须写在async函数中
async function getData(){
}//返回一个promise对象

async、await
async使用在函数前面,把函数变成一个异步函数,返回值是个promise对象。
await只能使用在async声明的函数里,不能使用在普通函数里。
Async/Await让我们用少量的代码来使用Promise,我们可以将一些有依赖关系的回调函数的处理逻辑放在async里面,然后在非async的区域使用,这样可以减少then或者catch回调。
使用 async / await, 搭配 promise, 可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性.

相较于 Promise,async/await有何优势

  1. 同步化代码的阅读体验(Promise 虽然摆脱了回调地狱,但 then 链式调⽤的阅读负担还是存在的)
  2. 和同步代码更一致的错误处理方式( async/await 可以⽤成熟的 try/catch 做处理,比 Promise 的错误捕获更简洁直观)
  3. 调试时的阅读性, 也相对更友好

标签:异步,resolve,Promise,reject,promise,pending
来源: https://blog.csdn.net/weixin_45337430/article/details/118707389

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有