如何将callback接口变成Promise接口?
···
var promisify = function promisify(fn, receiver) {
return function() {
for(var _len = argument.length, args = Array(_len), _key = 0; _key<_len; _key++) {
args[_key] = arguments[_key];
}
return new Promise(function (resolve, reject) {
fn.apply(receiver, [].concat(args,[function(err, res){
return err ? reject(err) : resolve(res);
}]));
});
};
};
···
通过 promisify这个函数,就可以把接口进行转换。
上面的模板就可以改成下面的形式:
···
var promisify = function promisify(fn, receiver) {
return function() {
for(var _len = argument.length, args = Array(_len), _key = 0; _key<_len; _key++) {
args[_key] = arguments[_key];
}
return new Promise(function (resolve, reject) {
fn.apply(receiver, [].concat(args,[function(err, res){
return err ? reject(err) : resolve(res);
}]));
});
};
};
···
特殊情况
有些设计不合理的接口可能会传递多个值给回调函数,如:
···
var fn = function(foo, callback){
if(success){
callback(null, file1, file2);
}else{
callback(err);
}
}
···
很明显 这个接口传了 file1,file2两个值,是没有办法用上述方法的,用了上述接口转换没有办法获取到file2的数据。
对于这种情况只能手工包装。
提高性能
可以使用高性能的Promise库来提高性能。如:bluebird。简单对比测试发现,blurbird 的性能是 V8 里内置的 Promise 3 倍左右.
替换内置的Promise:
global.Promise = require("bluebird");
如果项目里用了 Babel 编译 ES6 代码的话,可以用下面的方式替换:如果项目里用了 Babel 编译 ES6 代码的话,可以用下面的方式替换:
require("babel-runtime/core-js/promise").default = require("bluebird");
global.Promise = require("bluebird");
Node.js 8 中的 util.promisify使用
https://blog.csdn.net/weixin_33756418/article/details/91384889
https://www.jb51.net/article/115967.htm
原文
http://welefen.com/post/how-to-convert-callback-to-promise.html
网友评论