async+await基本用法

267 阅读1分钟

generator函数

generator函数基础

function* gen() {
    let a = yield 'a';
    let b = yield 'b';
    return a + b;
}

let it = gen();

let r = it.next();
r = it.next(r.value);
r = it.next(r.value);
console.log(r);

generator读文件示例

const fs = require('fs').promises;

// 方式--1.写法漂亮更趋向同步写法,2.可以中断执行 3.yield-产出语义不好
function* read() {
    try {
        let name = yield fs.readFile('./assets/name1.txt', 'utf-8');
        let age = yield fs.readFile('./assets/age.txt', 'utf-8');
        return `${name}---${age}`;
    } catch (e) {
        console.log(e, 'readFunc');
    }

}
//手动执行
let it = read();
it.next().value.then(data => {
    console.log(data);
    it.next(data).value.then(data => {
        console.log(data);
        let r = it.next(data);
        console.log(r);
    })
});
// 自动执行
function co(it) {
    return new Promise((resolve, reject) => {
        function next(data) {
            let { done, value } = it.next(data);
            if (done) {
                resolve(value);
            } else {
                Promise.resolve(value).then(
                    (data) => {
                        next(data);
                    }, (err) => {
                        it.throw(err);
                        reject(err);
                    });
            }
        }
        next();
    })
}
// 自动执行调用方式
co(read()).then(data => console.log(data), err => console.log(err, 'thenFunc'));

async+await 读文件示例

// es7 语法 async+await  ---对应generator的语法糖
// 1.写法很同步化 2.返回Promise  3.语法糖 async-异步,await等待执行 4.中断执行
async function read() {
    try {
        let name = await fs.readFile('./assets/name.txt', 'utf-8');
        console.log("准备读age.txt");
        let age = await fs.readFile('./assets/age.txt', 'utf-8');
        return `${name}---${age}`
    } catch (e) {
        throw e;
    }
}
// 异步函数用法-返回promise
read().then(data => console.log(data, 'succ-then'), err => console.log(err, 'thenErrFunc'));