浅解Promise

关于异步的处理方案

Promise

Promise是ES6新增的内置对象,一般运用Promise组织函数建立,Promise实例,处理异步题目。

1.Promise组织函数必需吸收一个函数作为参数,我将其称为executor函数,executor函数也能够吸收两个参数,resolve和reject,它们是两个函数由ECMAScript运转环境供应,无需本身布置。

//实行Promise函数,它返回一个promise实例对象
let promise=new Promise ((resolve,reject)=>{  
    console.log(1);
});

当我们运用new建立一个构建一个Promise实例后,Promise实例内部的两个属性须要明白。

让我们输出上方的promise实例

[[PromiseStatus]]: "pending"
[[PromiseValue]]: undefined

[[PromiseStatus]]:保留当前promise实例的状况,能够值pending,resolved,rejected

[[PromiseValue]]:在promise未完成状况时,其值为undefinde,当promise完成后,其值为异步数据,或许毛病信息。当实行了resolve(),[[PromiseValue]]的值就是resolve()传入 的表达式的值,一般就是是我们须要的值。当我们运用了reject(),这个值为reject()的传入值,一般这个值为毛病提醒

2.关于resolve和reject,它们的作用是推断对象的状况。而且它们挪用时能够吸收一个参数。

let promise=new Promise ((resolve,reject)=>{  
    console.log(1);
    resolve('胜利');
});

当挪用了resolve或reject ,promise实例的[[PromiseStatus]]将发作转变。

如今,让我们越发细致的去相识Promise

promise状况

一个Promise对象的当前状况必需为一下三种状况的一种:Pending(守候状况),Fulfilled(实行状况),Rejected(谢绝状况)

  • Pending:处于Pending状况时,promise能够满足以下前提

​ 能够由Pending转为Fulfilled或Rejected ,

  • Fulfilled:处于Fulfilled状况时,promise满足以下前提

​ 1.不可再变成别的状况。

​ 2.必需有一个不可被转变的值。

  • Rejected

​ 1.不可再变成别的状况。

​ 2.必需有一个不可被转变的值。

怎样明白Promise A + 范例中的这三个状况及其划定规矩。

Promise对象的两个内部属性能够很好帮我们去诠释明白。

[[PromiseStatus]] ,[[PromiseValue]]

如今,举行Promise第一步,新建一个Promise对象,对象两个内部属性被初始化

[[PromiseStatus]] :Pending

[[PromiseValue]]:undefined

此时是范例中的第一种状况,OK,依据范例的Pending状况的前提,我们能够去转变其状况。

executor函数在Promise对象建立后马上实行

倘使我们在executor函数实行了resolve()函数,而且,将一个
表达式(Expression)作为其参数传入。此时内部属性值的变化

[[PromiseStatus]]:resolved

[[PromiseValue]]:<表达式的值>

此时,Promise对象的状况有Pending变成Fulfilled.浅显点说,就是由守候变成胜利。依据Promise A+ 的Fulfilled状况的范例前提,此时,不管接下来在碰到什么情况,都不会去转变它的状况!,而且Promise对象将会有一个值,Yes,这个值就是我们须要的值,正确的说,它就是谁人传入的表达式的值,而且这个值经由过程resolve()函数存入了[[PromiseValue]]属性中。我们没法直接去运用它,而是经由过程then()去猎取

让我们来看个例子

let  p1 = new Promise((res,rej)=>{
 res((() => {
        return '胜利了';
        })())
    })
console.log(p1); 
//输出
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: "胜利了"

倘使我们在executor函数实行了reject()函数,而且,将一个
表达式(Expression)作为其参数传入。此时内部属性值的变化

let  p2 = new Promise((res,rej)=>{
 rej((() => {
      return '失利了';
    })())
})
console.log(p2);
// promise对象的两个属性
[[PromiseStatus]]: "rejected"
[[PromiseValue]]: "失利了"

此时,Promise对象的状况有Pending变成Fulfilled,由守候变成失利,依据Promise A+ 的Fulfilled状况的范例前提,此时,不管接下来在碰到什么情况,都不会去转变它的状况!而且Promise对象将会有一个值,一样也是谁人传入的表达式的值,不过我们将这个值称为拒因或失利缘由

注重:resolvereject并不会闭幕 Promise 的executor函数的实行

我们已经在executor函数中实行了resolve或reject函数,状况发作转变,内部属性值也发作了转变

如今,该启动then()要领和 catch()要领了。

then()

它有两个函数作为参数,一般,我们只运用第一个函数来猎取[[PromiseStatus]]的值为”resolved”的对象的[[PromiseValue]]值,回调函数吸收一个参数,此参数就是[[PromiseValue]]值

let  p1 = new Promise((res,rej)=>{
 res((() => {
        return '胜利了';
        })())
    }).then(data=>{
        console.log(data) 
    })

注重 : then() 要领发生一个微使命,其回调将会被置入上一个宏使命行列后。

cathc()

[[PromiseStatus]]为reject时,挪用此要领。

它吸收一个函数作为参数,此函数吸收一个参数,该参数就是拒因

let  p2 = new Promise((res,rej)=>{
 rej((() => {
        return '失利了';
        })())
    }).then(data=>{
        console.log(data) 
    }).catch(error=>console.log(error))

如今大抵相识了Promise是怎么回事了 Good!

另有注重 :不管怎样,在运用Promise对象时,加上catch(),不然你极能够不知道毛病究竟是出在那里

    原文作者:大明
    原文地址: https://segmentfault.com/a/1190000019332726
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞