原帖发在 CNode.js 论坛上, 见 https://cnodejs.org/topic/573b2d64fcf698421d20359d
听说 v8 已经着手实现 async/await 了, 可喜可贺
跟 bluebird promise.map 一样的功能, 提供 concurrency, 这个实现的核心代码抄自很久之前的 async.parallelLimit
https://github.com/magicdawn/promise.map
var map = require('promise.map');
var p = map(arr, function(item, index, arr){
return getOtherPromise(item);
}, concurrency);
还是跟 bluebird 的功能一致, 实现一个 sleep 功能 https://github.com/magicdawn/promise.delay
const sleep = require('promise.delay');
sleep(100).then(function(){
// blabla
});
类似 bluebird Promise.props, 实现 object 版本的 Promise.all https://github.com/magicdawn/promise.obj
const pobj = require('promise.obj');
const p = pobj({
x: Promise.resolve('x'),
y: Promise.resolve('y')
});
p.then(function(o){
o.x // 'x'
o.y // 'y'
})
给一个异步函数, 增加重试功能, 支持普通错误 & 超时错误. 这个貌似 bluebird 里面没有? https://github.com/magicdawn/promise.retry
const pretry = require('promise.retry');
const TimeoutError = pretry.TimeoutError;
const RetryError = pretry.RetryError;
const fnWithRetry = pretry(fn, options);
给一个异步函数加上超时处理 https://github.com/magicdawn/promise.timeout
var ptimeout = require('promise.timeout');
// a function will cost 20ms
function test() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(20);
}, 20);
});
}
const test10 = ptimeout(test, 10);
const test50 = ptimeout(test, 50);
// 10 timeout
try {
yield test10();
} catch (e) {
e.should.be.ok();
e.should.be.instanceof(ptimeout.TimeoutError);
e.message.should.match(/timeout/);
e.timeout.should.equal(10);
}
// 50 ok
const _50 = yield test50();
_50.should.be.ok();
_50.should.equal(20);
类似 bluebird Promise.promisify, 支持简单的 promiseifyAll, 以及 noerr 处理没有 err 的 callback 情况 https://github.com/magicdawn/promise.ify
var promiseify = require('promise.ify');
var readFile = promiseify(fs.readFile, fs);
var Connection = require('mysql/lib/Connection');
promiseify.all(Connection.prototype);
好的, 为什么实现 bluebird 那些方法呢, 因为不想绑死在 bluebird 上, 有一些原因要去掉 bluebird 的时候不会因为它的一些有用的方法而舍不得. 有了这些小工具库,可以选择任意 Promise A+ 实现哦~都是使用的 global.Promise
注意 promise.retry 使用了 generator, 目标环境为 ES6, 其他的包都是 target 到 ES5 的, 就是 browserify or webpack 直接 require 即可, 不需要再次编译.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.