ES6学习笔记(四):异步操作

Promise

Promise三种状态

pending、resolved、rejected

使用语法

var promis = new Promise(function(resolve,reject){
  $.ajax({
    url:'/api/something.json',
    method:'get',
    datatype:'json',
    success:(res) =>{
      resolve(res)
    },
    error:(err)=>{
      reject(err)
    }
  })
})

promis.then(function(res){
  console.log(res)
}).catch(function(err){
  console.log(err)
});

Promise.prototype.then()

链式调用,状态变为resolve
如果把下一步想要的东西return出去,即可让下一个then使用

var promise = new Promise(function(resolve,reject){
  $.ajax({
    url:'/api/poisearch.json',
    method:'get',
    datatype:'json',
    success:(res) =>{
      resolve(res)
    },
    error:(err)=>{
      reject(err)
    }
  })
})

promise.then(function(res){
  return res.data
}).then(function(data){
  return data.result;
}).then(function(result){
  console.log(result)
});

上面的代码还可以借用箭头函数简写成,极大提升了代码的简洁性和可读性

promise.then(res => res.data)
  .then(data => data.result)
  .then(result => console.log(result));

Promise.prototype.catch()

如果异步操作抛出错误,状态就会变为Rejected,就会调用catch方法指定的回调函数,处理这个错误。

  1. 另外,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
  2. 如果Promise状态已经变成Resolved,再抛出错误是无效的。
  3. catch方法返回的还是一个Promise对象,因此后面还可以接着调用then方法。

Promise.all()

多个Promise实例,包装成1个,有点类似Array.prototype.every()
用法:

var p = Promise.all([p1, p2, p3]);
  1. 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
  2. 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

Promise.race()

多个Promise实例,包装成1个,有点类似Array.prototype.some()

  1. p1、p2、p3其中一个状态变成fulfilled,p的状态就会变成fulfilled
  2. 那个率先改变的Promise实例的返回值,就传递给p的回调函数。

done()、finally()

posted @ 2016-09-21 00:27  水乙  阅读(1859)  评论(0编辑  收藏