ECMAScript 6 异步操作和Async函数

众所周知的,Javascript是一种单线程的语言,所有的代码必须按照所谓的“自上而下”的顺序来执行。
本特性带来的问题就是,一些将来的、未知的操作,必须异步实现(关于异步,我会在另一篇文章里进行讨论)。
本文将讨论一个比较常见的异步解决方案——Promise,时至本文最后更新的日子,Promise的应用已经极其广泛。

Promise的基本用法

时至今日,很多现代浏览器都已经实现,但是为了兼容,建议自行对Promise进行封装或者使用第三方的解决方案(如webpack对es6语法进行编译)。 那么,我么将得到一个Promise构造函数,新建一个Promise的实例:

var _promise = new Promise(function(resolve, reject){
        setTimeout(function(){
            var rand = Math.random();
            if(rand<0.5){
                resolve("resolve" + rand);
            }else{
                reject("reject" + rand);
            }
        },1000);

    });

    /*运行结果:
     *有两种情况:
     *1)无事发生
     *2)报错形如:d.js:7 Uncaught (in promise) reject0.9541820247347901
     */

由上所示,Promise的构造函数接收一个函数作为参数,该函数接受两个额外的函数,resolve和reject,这两个函数分别代表将当前Promise置为fulfilled(解决)和rejected(拒绝)两个状态。
Promise正是通过这两个状态来控制异步操作的结果。
接下来我们将讨论Promise的用法,实际上Promise上的实例_promise是一个对象,不是一个函数。在声明的时候,Promise传递的参数函数会立即执行,因此Promise使用的正确姿势是在其外层再包裹一层函数。


async 函数的用法

async函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。

下面是一个例子。

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

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

上面代码是一个获取股票报价的函数,函数前面的async关键字,表明该函数内部有异步操作。调用该函数时,会立即返回一个Promise对象。

下面的例子,指定多少毫秒后输出一个值。

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value)
}

asyncPrint('hello world', 50);

上面代码指定50毫秒以后,输出"hello world

 
posted @ 2019-01-02 11:18  茉雨而眠  阅读(263)  评论(0编辑  收藏  举报