微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

promise的使用

promise是什么?
 它是一个对象,有三种状态:
  pending: 初始状态,不是成功或失败状态。
  pfulfilled: 意味着操作成功完成。
  rejected: 意味着操作失败。

有什么作用?

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

优缺点
 优点:

  1. 异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数
  2. Promise 对象提供统一的接口,使得控制异步操作更加容易。

 缺点:

  1. 无法取消 Promise,一旦新建它就会立即执行,无法中途取消
  2. 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部
  3. 当处于 Pending 状态时,无法得知目前进展到哪一个阶段

promise的创建

const promise = new Promise(function(resolve, reject) {
    //写异步操作代码
    //结果使用resolve,reject处理
}).then(function(result) {
   //接受resolve调用的值
}).catch(function(err) {
    //接受reject调用的值
})

实例

const promise = new Promise(function(resolve, reject) {
     //写异步操作代码
     //结果使用resolve,reject处理
     setTimeout(function() {
         resolve('resolve');
     }, 1000);
 }).then(function(result) {
     //接受resolve调用的值
     console.log(result);//打印resolve
 }).catch(function(err) {
     //接受reject调用的值
     console.log(err);
 })

  注意:如果同时写了resolve和reject,谁先写的,就会执行谁,不会执行完之后再去执行另一个,promise状态只能改变一次。

promise常见面试题

console.log(1);
const promise = new Promise(function(resolve, reject) {
    console.log(2);
    setTimeout(function() {
         console.log(4);
    }, 1000);
    resolve(3);
    console.log(5);
}).then(function(result) {
    console.log(result);
})
console.log(6);
//打印12463

解析:按照从上倒下优先执行顺序,首先打印的是1,2,5,6;js中先运行主线程的程序,再运行事件队列中的程序;promise和定时器都属于事件队列,其中,在js中promise是微队列,定时器是宏队列,微队列要比宏队列优先执行,所以其次打印的是3,4。最后打印的结果是:1、2、5、6、3、4

promise简单写法

async function promise() {
  return await 1;
}
promise().then(function(resolve) {
    console.log(resolve);
}).catch(function(err) {
    console.log(err);
})

async相当于是new Promise对象,await相当于是resolve或者reject,这个比较简单,但是有一点需要注意的是,它的状态不可控,你不知道promise现在的状态是什么,可能是pfulfilled状态,也可能是rejected状态,所以你需要同时监听两种状态

promise方法
Promise.all方法

var p = Promise.all([p1,p2,p3]);

Promise.all 方法接受一个数组作为参数,p1、p2、p3 都是 Promise 对象的实例。(Promise.all 方法的参数不一定是数组,但是必须具有 iterator 接口,且返回的每个成员都是 Promise 实例。)
p 的状态由 p1、p2、p3 决定,只有状态都是fulfilled,p的状态才是fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数;否则p状态就是rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数

Promise.race 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

var p = Promise.race([p1,p2,p3]);

方法是只要有一个实例状态先改变,p的状态就改变,先改变的实例返回值就会传递给p的返回值

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐