乐趣区

关于javascript:关于promise学习

同步与异步

js 是单线程语言,单线程就是一次只能实现一个工作。
如果有多个工作就须要排队,如果一个工作排队事件太长,就会导致阻塞。
这个时候就须要异步操作

同步即阻塞,异步即非阻塞

异步能够不是程序执行,异步工作有一个或多个回调函数。
比拟常见的异步有 setTimeOut 和 setInterVal,他们能够扭转工作执行程序

什么是 promise

Promise 对象用于示意一个异步操作的最终实现(或失败)及其后果值

一个 Promise 必然处于一下三种状态之一:

待定 (pending): 初始状态,既没有被兑现,也没有被回绝

已兑现 (fulfilled): 意味着操作兑现实现

已回绝 (rejected): 意味着操作失败

promise 的应用

链式调用

咱们能够用 promise.then(),promise.catch() 和 promise.finally() 这些办法将进一步的操作与一个变为已敲定状态的 promise 关联起来。

这些办法还会返回一个新生成的 promise 对象,这个对象能够被非强制性的用来做链式调用

const promiseA = new Promise((resolut,reject)=>{resolut(777)
});
setTimeout(() => {console.log(promiseB,'promiseB');
}, 1000);
promiseA.then(resolut => {console.log(resolut,'resolut1');
  return 111
}).then(resolut => {console.log(resolut,'resolut2');
  return 222
}).then(resolut => {console.log(resolut,'resolut3');
  throw new Error('error')
}).catch(()=>{console.log('promiseA 失败');
})
后果
// 777 'resolut1'
// 111 'resolut2'
// 222 'resolut3'
// promiseB 失败 
静态方法
Promise.all(iterable)

这个办法会返回一个新的 Promise 对象,常被用来解决多个 Promise 对象的状态汇合。该 promise 对象在 iterable 参数对象里所有的 promise 都胜利的时候才会触发胜利,一旦有任何一个 promise 对象失败则立刻触发失败。

Promise.allSettled(iterable)

等到所有 promises 都已敲定(settled)(每个 promise 都已兑现(fulfilled)或已回绝(rejected))。
返回一个 promise,该 promise 在所有 promise 实现后实现。并带有一个对象数组,每个对象对应每个 promise 的后果。

Promise.any(iterable)

接管一个 Promise 对象的汇合,当其中的一个 promise 胜利,就返回那个胜利的 promise 的值。

Promise.race(iterable)

接管一个 Promise 对象的汇合,当其中的一个 promise 胜利或者失败,就返回那个的 promise 的值。

  const promiseA = new Promise((resolut,reject)=>{resolut(777)
  });
  const promiseB = new Promise((resolut,reject)=>{resolut(888)
  });
  const promiseC = new Promise((resolut,reject)=>{resolut(999)
  });
  Promise.all([promiseA,promiseB,promiseC]).then(res =>{console.log(res);
  })
  // [777, 888, 999]
  Promise.allSettled([promiseA,promiseB,promiseC]).then(res =>{console.log(res);
  })
  <!-- [
    {
        "status": "fulfilled",
        "value": 777
    },
    {
        "status": "fulfilled",
        "value": 888
    },
    {
        "status": "fulfilled",
        "value": 999
    }
  ] -->
  Promise.any([promiseA,promiseB,promiseC]).then(res =>{console.log(res);
  })
  // 777
  Promise.race([promiseA,promiseB,promiseC]).then(res =>{console.log(res);
  })
  // 777

参考:

https://zhuanlan.zhihu.com/p/…

https://developer.mozilla.org…

退出移动版