Promise

101 阅读1分钟

Promise方法

Promise.all()

【谁跑的慢以谁为准】执行回调,此时返回值组成一个数组,传递给回调函数 只要其中一个被rejected,状态就变成rejected,第一个rejected的实例的返回值会传递给回调函数

const p1 = new Promise((resolve, reject) => {
resolve('hello');
}) 
.then(result => result) 
.catch(e => e); 

const p2 = new Promise((resolve, reject) => { 
throw new Error('报错了'); 
}) 
.then(result => result) 
.catch(e => e); 
// 若作为参数的Promise实例自己定义了catch方法,
//若它一旦被rejected就不会再出发Promise.all()的catch方法

Promise.all([p1,p2])
.then( result=>console.log(result) )
.catch( e=>console.log(e) 
// ["hello", Error: 报错了] )

Promise.race()

【谁跑得快以谁为准】只要其中一个实例先改变状态,状态就跟着改变将率先改变的Promise返回值传递给回调函数

const p = Promise.race([ fetch('/resource-that-may-take-a-while'),

new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 5000) 
}) 
]); 

p
.then(console.log)
.catch(console.error);

Promise.reject()

Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected

const p = Promise.reject('出错了'); 
// 等同于
const p = new Promise((resolve, reject) => reject('出错了')) 
p
.then(null, function (s) { 
console.log(s) // 出错了 
});

Promise.resolve()

Promise.resolve(),将现有对象转为 Promise 对象

Promise.resolve('foo') 
// 等价于 
new Promise(resolve => resolve('foo'))

Promise.try()

不知道或不想区分,函数是同步还是异步操作,但是想用Promise来处理

  // 一: 
  const f = () => console.log('now');
  Promise.resolve().then(f); 
  console.log('next') 
  // next now 
  
  // 二:让同步函数同步执行,异步函数异步执行 
  const f = () => console.log('now') 
  (async () => f())(); 
  console.log('next'); 
  // now next 
  
  const f = () => console.log('now'); 
  ( ()=>new Promise( resolve => resolve(f()) ) )();
  console.log('next') 
  // now next 
  
  const f = () => console.log('now'); 
  Promise.try(f); 
  console.log('next')