zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    第一本书 第七章(课后题)
    java基础小测试
    随笔1
    随笔
    日记 晴 2017.7.30
    自我介绍
    与或非逻辑运算符 与或非位运算符
    日记1 天气阴 阵雨
    归并排序的两个版本实现代码
    Winedt打开tex文件报错error reading的解决方案
  • 原文地址:https://www.cnblogs.com/jasonxuli/p/7019398.html
Copyright © 2011-2022 走看看