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;