nodejs 8 利用原生 util.promisify() 实现 promise.delay()

Nodejs 8 在 util 包里新增了 promisify() 。这个方法基本和 bluebird 的 promisify() 作用一样,即把最后一个参数是 callback 函数的函数变成返回 promise 的函数;

 

下面代码,用 expressjs 做载体,创建了一个 web API,延迟 3 秒后随机返回标题为 Success 或者 Custom Error 的页面。

delayP() 的作用与 bluebird 的 promise.delay() 方法作用相仿,可以在 promise chain 中进行 delay 操作。

"use strict";
var express = require('express');
var router = express.Router();

var util = require('util')

/* 延迟 3 秒后,随机返回标题为 Success 或者 Custom Error 的页面 */
router.get('/', function (req, res, next) {
    getDelayedResult()
        .then(function(r){
            console.log("delayed callback.")
            res.render('index', {title: r});
        })
        .catch(function(e){
            console.log(e)
            res.render('index', {title: e.message});
        })

});

async function getDelayedResult(){
    console.log("async function.");
    return await delayP(3000)   // await 后面必须返回 promise 类型
}


function delay(t, cb) {   // cb: function callback(){}
    setTimeout(function(){
        var err = null;
        var rand = parseInt(Math.random() * 2); // 随机数取值范围为整数 0, 1
        console.log(rand);
        if(rand)
            err = new Error("Custom Error");
        cb(err, "Success.");   // cb: 第一个参数是 err,如果 err != null,那么认为是错误,会进入 promise.catch() 分支; 否则,进入 then() 分支。
    }, t)
}
var delayP = util.promisify(delay)  // 模拟异步IO请求;使用原生 promisify() 把 delay 函数 promise 化,以返回 promise 类型;


module.exports = router;

 

posted @ 2017-06-15 18:28  牛太黑  阅读(1863)  评论(0编辑  收藏  举报