[关闭]
@jsongao98 2021-04-24T12:14:08.000000Z 字数 3315 阅读 180

Promise,async/await

JavaScript


Promise

         此处输入图片的描述

new Promise被创建时,内部executor就自动执行,executor接受两个函数参数,resolve和reject

  • Promise.state / .result
  • new Promise( (resolve,reject) => {...} )
  • Promise.resolve()/reject()
  • Promise.prototype.then ()/ .catch ()/ .finally()
    1. Promise.resolve().then(() => {//p1
    2. console.log(0);
    3. return new Promise.resolve(4);})
    4. //p2,p2的状态和参数会传给p1.then中回调函数返回的promise
    5. //如果 p2 是整数/字符串,则执行 FulfillPromise,直接改变 p1 的状态和结果
    6. //但这里p2是一个fulfilled的promise,引擎内部的执行大致相当于 JS 代码:p1 = p2.then(undefined, undefined)
    7. //执行完p2,p2变为fulfilled后p1才变为fullfilled
    8. .then((res) => {
    9. console.log(res)
    10. })
    11. Promise.resolve().then(() => {
    12. console.log(1);
    13. }).then(() => {
    14. console.log(2);
    15. }).then(() => {
    16. console.log(3);
    17. }).then(() => {
    18. console.log(5);
    19. }).then(() =>{
    20. console.log(6);
    21. })
    1. axios(option)
    2. .then(res => {
    3. if (res.status === 200) {
    4. resolve(res.data); //响应状态码为200,resolve
    5. console.log(res.data);
    6. } else {
    7. reject(res.data); //不是200,在200~300之间,reject抛出
    8. }
    9. })
    10. .catch(err => {
    11. Message({
    12. type: "error",
    13. message: err.response.data.msg
    14. });
    15. reject(err);//
    16. });
    1. //当promiseA由pendding向settled过渡后,两个then会被调用。注意,这里并非链式调用。
    2. const promiseA = new Promise(myExecutorFunc);
    3. const promiseB = promiseA.then(handleFulfilled1, handleRejected1);
    4. const promiseC = promiseA.then(handleFulfilled2, handleRejected2);

    async/await


    Promise的错误处理:

    1. window.addEventListener('unhandledrejection', function(event) {
    2. // 这个事件对象有两个特殊的属性:
    3. alert(event.promise); // [object Promise] - 生成该全局 error 的 promise
    4. alert(event.reason); // Error: Whoops! - 未处理的 error 对象
    5. });
    6. new Promise(function() {
    7. throw new Error("Whoops!");
    8. }); // 没有用来处理 error 的 catch

    Promise API

  • Promise.all:手动实现Promise.all(计数器统计参数中被resolve的promise个数)

  • Promise.allSettled:Promise.allSettled 等待所有的 promise 都被 settle,无论结果如何。

  • Promise.race: Promise数组中最先resolve或reject的那个promise的结果被返回

  • Promise.any: 忽略Promise数组中的reject, 直至有resolve的promise的结果返回,若没有一个resolve,则返回reject


    thenable对象:
    确切地说,处理程序(handler)返回的不完全是一个 promise,而是返回的被称为 “thenable” 对象 — 一个具有方法 .then 的任意对象。它会被当做一个 promise 来对待。
    JavaScript 检查在由 .then 处理程序(handler)返回的对象:如果它具有名为 then 的可调用方法,那么它将调用该方法并提供原生的函数 resolve 和 reject 作为参数,并等待直到其中一个函数被调用。
    这个特性允许我们将自定义的对象与 promise 链集成在一起,而不必继承自 Promise。

  • 添加新批注
    在作者公开此批注前,只有你和作者可见。
    回复批注