Node

koa2 async和await 实战详解

2017-01-04  本文已影响1518人  码农随想录

基本用法


第一个例子: await只能用在async函数


let funPromise = function (time) {
    return new Promise(function (resolve, reject) {
        //Pending 进行中
        setTimeout(function () {
            resolve(); // 从 pending 变为 resolved
        }, time);
    })
};

let funAsync = async function () {
    let numArr = [1003, 1002, 1001];
    // 会报错 await没有在async函数中
    numArr.forEach(function(value, index){
        await funPromise(value);
    })
}

funAsync();
let funPromise = function (time) {
    return new Promise(function (resolve, reject) {
        //Pending 进行中
        setTimeout(function () {
            // 从 pending 变为 resolved
            resolve(time + ' : ' + new Date()); 
        }, time);
    })
};

let funAsync = async function () {
    let numArr = [1003, 1002, 1001];
    numArr.forEach(async function(value, index){
        //三个funPromise()操作将是并发执行,也就是同时执行,而不是继发执行
        let result = await funPromise(value);
        console.log(result);
    })
}

funAsync();
第一个例子错误示例2的运行结果
let funPromise = function (time) {
    return new Promise(function (resolve, reject) {
        //Pending 进行中
        setTimeout(function () {
            // 从 pending 变为 resolved
            resolve(time + ' : ' + new Date());  
        }, time);
    })
};

let funAsync = async function () {
    let numArr = [1003, 1002, 1001];
    // 三个funPromise()操作将是继发执行
    for (let value of number){
        let result = await funPromise(value);
        console.log(result);
    }
}

funAsync();
第一个例子正确示例子的运行结果

第二个例子:await等待promise返回结果


let funPromise = function (time) {
    return new Promise(function (resolve, reject) {
        //Pending 进行中
        setTimeout(function () {
            resolve(); // 从 pending 变为 resolved
        }, time);
    })
};

let funAsync = async function () {
    // 在这里使用起来就像同步代码那样直观
    console.log('start:  ' + new Date());
    await funPromise(3000);
    console.log('end:  '  + new Date());
};

funAsync();
第二个例子的运行结果

第三个例子:等待async函数中的promise返回结果


let funPromise = function (time) {
    return new Promise(function (resolve, reject) {
        //Pending 进行中
        setTimeout(function () {
            resolve(); // 从 pending 变为 resolved
        }, time);
    })
};

let funAsync_1 = async function () {
    console.log('funAsync_1_start:  ' + new Date());
    await funPromise(3000);
    console.log('funAsync_1_end:  '  + new Date());
};

let funAsync_2 = async function () {
    console.log('funAsync_1_start:  ' + new Date());
    // 等待 funAsync_1() 中的 Promise 运行结束
    await funAsync_1();
    console.log('funAsync_1_end:  '  + new Date());
};

funAsync_2();
第三个例子的运行结果

注意点


let funPromise = function (time) {
    return new Promise(function (resolve, reject) {
        //Pending 进行中
        setTimeout(function () {
            reject('我是返回的错误'); // 从 pending 变为 rejected
        }, time);
    })
};

let funAsync = async function () {
    console.log('start:  ' + new Date());
    try {
        await funPromise(3000);
        console.log('我不会执行的噢');
    }  catch (err) {
        console.log(err);
    }
    console.log('end:  '  + new Date());
};

funAsync();
注意点的程序运行结果

源码查看


https://github.com/yangxiaopingios/koaExample/blob/master/code/script/oneExample.js

上一篇 下一篇

猜你喜欢

热点阅读