Promise所有知识

102 阅读5分钟

之前学ES6的时候,总感觉Promise的概念很难,学的迷迷糊糊。但axios使用Promise封装了ajax,所以必须对promise很熟悉。 此外,在面试中,es6中,内置对象已经添加Promise(控制抽象对象),Promise也是必问的。以下从Promise的定义,api,关键问题。到Promise面试题。到手写Promise。

0 补充知识

0.1 实例对象和函数对象

0.2 回调函数的两种类型

0.3 JS的err处理

1 Promise理解和使用

1.1 Promise是什么?

1 抽象表达:Promise就是新的异步编程(旧的是纯回调形式)

2 具体表达: 语法:Promise就是一个构造函数。 功能:Promise对象用来封装异步操作,并且可以其获取结果。

1.2 为什么使用Promise?

1 旧:回调方式不灵活。回调函数,必须在异步任务之前指定。 promise:启动异步任务=》返回promise对象=》给promise对象绑定回调。

2 旧:会引发回调地狱。 promise:使用链式调用。

1.3 如何使用Promise?

a. Promise()

promise:构造器。主要用于包装不支持promise(返回值不是Promise)的函数。

语法:new Promise (executor)。

1个双参函数:executor

2个参数:resolve,reject。

3个状态: executor函数里面,一般有异步函数,resolve(参数1:someValue)函数和reject(参数2:failure reason)函数。 调用reslove函数会使状态从pedding变成 resolved,并且返回一个值代表成功。调用reject函数会使状态pedding变成rejected,并且返回失败原因。(如果是抛出异常,promise会变成rejected,executor的返回值也会被忽略)

4接收,一般是使用const p1。或者函数里面 return。 或者Promise.链式调用。

5代码:

const p1 = /return  new Promise( //1个构造器:executor
//2个参数:
    (reslove,reject)=>{ setTimeout({
    if(a){ reslove(); //3状态改变
    }esle{reject();
    }
    },1000)
})

b.Promise.prototype.then()

then()方法是返回一个Promise。最多有两个参数:Promise成功的情况的回调(回调函数名称:onResolved())和失败时候的回调(onRejected)。

1如果是提供非函数参数,那么then方法会丢失该状态的回调函数信息,但是并不会产生错误。

2如果调用 then 的 Promise 的状态(fulfillment 或 rejection)发生改变,但是 then 中并没有关于这种状态的回调函数,那么 then 将创建一个没有经过回调函数处理的新 Promise 对象,这个新 Promise 只是简单地接受调用这个 then 的原 Promise 的终态作为它的终态。

语法: 1参数: p.then(onFuliled[,onRejected]) ,p.then(value=>{}, reason=>{})。//onFulied 可选,fulfilled时候,调用参数。如果参数不是函数,内部替换x=>x;

2返回值: 当一个 [Promise] 完成(fulfilled)或者失败(rejected)时,返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回。如果 then 中的回调函数:

1返回值: 2没有返回值: 3抛出错误。

4返回一个是接受状态的Promise 5返回一个是 6返回一个未定状态的

c.Promise.prototype.catch()

.catch:(onRejected) =>{} onRejected函数:失败函数的回调{reason}=>{} 此函数是.then的语法糖。then(undefined,onRejected)

d.Promise.prototype.finally()

e.Promise.reject() Promise.reject(3);

f.Promise.resolve() Promise.resolve(2); Promise.( (resolve,reject)=>{ resolve(2)};

g.Promise.all([p1,p2,p3]):返回Promise pAll.then( values =>{ values},[1,2]//成功返回成功的数组,按照顺序的,并不是按照异步结果 reason=>{reason} //失败返回失败的数组,按照顺序的,并不是按照异步结果 )

h.Promise.race([p1,p2,p3]): 返回Promise。取第一名的结果。 如果是同步的,返回第一个。如果是异步的,返回最先的。

1.4关键性的问题

1如何改变Promise的状态? Promise( resolve(1), //resolved reject(1), //rejected throw new Error()。throw 3//rejectd 。(js内部一次) ) p.then(value=>{},reason=>{consloe.log(reason)}

2.一个Promise指定多个成功或者失败的回调函数,都会调用嘛? p.then(reason=>{console.log(1}) p.then(reason=>{console.log(2}) 当Promise改成为对于的状态都会调用。

3.改变Promise状态和指定回调函数谁先谁后?

  1. Promise.then()返回的新的Promise的状态又谁决定。 【.then返回的promise由回调函数结果指定】 答案:1先回答一句话,then()指定的回调函数执行的结果决定。 2详细表达: a.抛出异常,新的promise变为rejected,reason为抛出的异常
    b.返回Promise的任意值,新的promise是resolved,value是返回的结果。 c.返回另一个新的Promise,此promise变成新promise的结果。

a.返回的是非Promise,则看return。没有return就是0. b. 返回的是Promise,则看Promise的状态。

5.Promise如何串联多个任务操作。 除了第一个,剩下函数的只能是return返回(throw的话是不返回的,是erro)

2.同步的返回: 看return。 没有return

1.promise异步的返回: 看resolve(1)() reject。 throw。 有resolve:不返回。 同步里面的嵌套异步: 先return 在看return的是同步还是异步。 同步:2。 异步:new Promise。 没有return:那么就是什么都不返回。

2.then返回你失败,1 throw 异常。2 return newPromise(rej) 6.Promise异常传递?穿透。4:33 1.当使用promisethen链式调用,可以在最后指定失败的回调。 2 前面任何操作出了异常,都会传到失败的回调中处理。

7.中断Promise链? 1 promisethen链式调用,中间中断,不在调用后面的回调函数。 2 方法,在函数中返回一个pendding状态的promise对象。 return new Promise(()=>{})//返回一个pending的promise。

3手写Promise

3.1 Promise整体构造

4Promise面试题。

同步异步问题