async await使用

promise使用

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve('ok');
        }, time);
    })
};

sleep(3000).then((d) => {
	console.log(d)  // 3秒后输出ok
})

async await使用

// async 表示这是一个async函数,await只能用在这个函数里面。
// await 表示在这里等待promise返回结果了,再继续执行。
// await 后面跟着的应该是一个promise对象

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve('ok');
        }, time);
    })
};

async function start () {
    console.log( await sleep(3000) )    // 3秒后输出ok
};
start();

async await捕捉错误

// async await中.then(..)不用写了,那么.catch(..)也不用写,可以直接用标准的try catch语法捕捉错误。

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            // 模拟出错了,返回 ‘error’
            reject('error');
        }, time);
    })};
var start = async function () {
    try {
        console.log('start');
        await sleep(3000); // 这里得到了一个返回错误
        
        // 所以以下代码不会被执行了
        console.log('end');
    } catch (err) {
        console.log(err); // 这里捕捉到错误 `error`
}};

循环多个await

await看起来就像是同步代码,所以可以理所当然的写在for循环里,不必担心以往需要闭包才能解决的问题。

// ..省略以上代码

var start = async function () {
    for (var i = 1; i <= 10; i++) {
        console.log(`当前是第${i}次等待..`);
        await sleep(1000);
    }};
值得注意的是,await必须在async函数的上下文中的。
..省略以上代码

let 一到十 = [1,2,3,4,5,6,7,8,9,10];
// 错误示范一到十.forEach(function (v) {
    console.log(`当前是第${v}次等待..`);
    await sleep(1000); // 错误!! await只能在async函数中运行});
// 正确示范for(var v of 一到十) {
    console.log(`当前是第${v}次等待..`);
    await sleep(1000); // 正确, for循环的上下文还在async函数中}

参考:http://cnodejs.org/topic/5640b80d3a6aa72c5e0030b6

posted @ 2017-11-09 15:55  Mr.曹  阅读(548)  评论(0编辑  收藏  举报