ES6 promise

91 阅读1分钟

promise

异步编程的一种解决方案,promise是一个对象

promise对象的特点

  • 对象状态不受外界影响 三种状态
    • pending(进行中)
    • fulfilled(已成功)
    • rejected(已失败)
  • 一旦状态改变就不会再变 缺点
  • 一旦新建就会立即执行,无法中途取消
  • 如果不设置回调函数,promise内部抛出的错误,不会反应到外部
  • 当处于pending状态时,无法得知目前进展到哪一个阶段

基本用法

Promise.prototype.then()

为promise实例添加状态改变时的回调函数

两个参数,成功回调和失败回调

const promise = new Promise(function(resolve,reject){
if(){
resolve(value)
}else {
reject(error)
})

promise.then(function(value){
},function(error){
})

简单例子

function timeout(ms){
return new Promise((resolve,reject)=>{
setTimeout(resolve,ms,done)
})
timeout(100).then((value)=>{
console.log(value)
})

promise.prototype.catch()

指定发生错误时的回调函数

const promise = new Promise(function)

promise.all()

接收一个iterable类型(Array,Masp,Set)的输入,并且只返回一个promise实例

const p = promise.all([p1,p2,p3])

p1,p2,p3的状态全部为fulfiled,p的状态才为fulfilled p1,p2,p3之中有一个被rejected,p的状态就变成rejected

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});

// Array[3,4,'foo']

promise.race()

返回一个promise,一旦某个promise实例状态率先被改变,promise.race()的状态就跟着改变

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then((value) => {
  console.log(value);
  
});

//"two"
// promise2率先完成返回结果two