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对象,返回改对象的结果。