node 开发中常用的async/await 处理回调的几种形式

一、单一的回调处理

//下面两种形式的async函数效果相同,await只能用在async函数内部
async function(){}
async () => {}

(1)http请求

var http = require('http');

(async () => {

    var res = await new Promise(function (resolve, reject) {

        var options = {
            hostname: 'XXX.com',
            path: "/api",
            method: 'GET'
        };

        var req = http.request(options, function (res) {
            console.log('STATUS: ' + res.statusCode);
            console.log('HEADERS: ' + JSON.stringify(res.headers));
            res.setEncoding('utf8');
            res.on('data', function (chunk) {
                console.log('BODY: ' + chunk);
                resolve(chunk);
            });
        });
        req.on('error', function (e) {
            console.log('problem with request: ' + e.message);
            reject(new Error('http failed'));
        });
        req.end();
    });
    console.log('request body:' + res);
})();

(2)数据库查询

这里用sequelize作为orm中间件,配置好数据库连接后在函数内:

(async () => {
    var Pets = await Pet.findAll({
        offset: 0,
        limit: 5,
        where: { id: 1 }
    });   
    console.log(Pets[0].name); 
})();

(3)文件i/o

import fs from 'fs';
import path from 'path';

var movieDir = __dirname + '/movies',
    exts     = ['.mkv', '.avi', '.mp4', '.rm', '.rmvb', '.wmv'];

// 读取文件列表
var readFiles = function () {
    return new Promise(function (resolve, reject) {
        fs.readdir(movieDir, function (err, files) {
            resolve(files.filter((v) => exts.includes(path.parse(v).ext)));
        });
    });
};

(async () => {
    let files = await readFiles();

    // await只能使用在原生语法
    for (var file of files) {
        let name = path.parse(file).name;

        console.log(`正在获取【${name}】的海报`);
        savePoster(name, await getPoster(name));
    }

    console.log('=== 获取海报完成 ===');
})();

二、多个并发的回调处理

比如服务器端多个请求可以并发运行,但需要都返回结果后再运行下面的代码,此处也可以是数据库,或者其他耗时回调操作,这里拿数据库操作举例

(async () => {
    var petPromise = new Promise(function (resolve, reject) {
        Pet.findOne({
            where: {
                id: 1
            }
        }).then(function (p) {
            resolve(p);
        }).catch(function (err) {
            reject(new Error('failed: ' + err));
        });
    });
    var perPromise = new Promise(function (resolve, reject) {
        Pet.findOne({
            where: {
                id: 1
            }
        }).then(function (p) {
            resolve(p);
        }).catch(function (err) {
            reject(new Error('failed: ' + err));
        });
    });
    var argList = await Promise.all([petPromise, perPromise]);
    console.log(argList[1].name + 'love' + argList[0].name)})();
})();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值