js中的异步Promise、Generator、async

Promise编程

Promise是js异步编程的解决方案,Promise是一个对象,内部会存在一个异步操做,Promise对象提供统一的api来获取异步操做的结果。api

const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 异步操做成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

Promise构造函数接收一个函数做为参数,函数的两个参数非别是resolve和reject,resolve将Promise对象的状态从“未完成”变为“成功”,reject将状态从“未完成”变为“失败”,而且两个方法会将异步操做的结果经过参数传递出去。promise

Promise的then方法能够指定成功和失败的回调函数,而且将结果做为回调函数的参数。而且then方法返回一个新的Promise对象,因此能够链式调用。异步

catch方法是then(null, rejection)的别名,用于指定在发生错误时的回调函数。若是采用链式写法,将catch放在最后,catch会捕捉到前面全部promise对象中的错误。async

finally方法不论Promise对象最后是什么状态都会执行。异步编程

Promise.resolve()方法返回一个Promise对象,若是传入一个Promise对象会原封不动的返回此Promise对象,若是参数是一个原始值,会返回一个resolved状态的Promise对象,回调函数会当即执行。函数

 

Generator函数spa

Generator是ES6提供的一种异步编程解决方案,调用Generator返回一个遍历器对象,调用遍历器对象的next()方法会返回一个对象,对象的done属性指示是否遍历完,value属性指示状态值(yield 后面表达式的值)。code

function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}

var hw = helloWorldGenerator();

hw.next()
// { value: 'hello', done: false }

hw.next()
// { value: 'world', done: false }

hw.next()
// { value: 'ending', done: true }

hw.next()
// { value: undefined, done: true }

 next()方法还接收一个参数,能够向Generator函数体内输入数据。下面第二个next的参数2传递给了上一个异步阶段返回的结果变量y。对象

function* gen(x){
  var y = yield x + 2;
  return y;
}

var g = gen(1);
g.next() // { value: 3, done: false }
g.next(2) // { value: 2, done: true }

 

async

ES2017引入了async函数,async仅仅是Generator函数的语法糖,不一样的是Generator函数须要调用next()方法一步步执行,async会自动执行。await命令后面能够是Promise对象,也能够是原始类型的值(会转变为resolved状态的Promise对象)。async函数返回一个Promise对象,return后的值会做为Promise对象then方法中成功回调函数中的参数。

async function getStockPriceByName(name) {
  const symbol = await getStockSymbol(name);
  const stockPrice = await getStockPrice(symbol);
  return stockPrice;
}

getStockPriceByName('goog').then(function (result) {
  console.log(result);
});

await命令后面是一个Promise对象,返回改对象的结果。

相关文章
相关标签/搜索