问题
经常会遇到把普通callback形式的函数转换成Promise形式,一般情况下需要在原来函数上嵌套一层壳来实现,但是如果需要转换的函数比较多,这种方法就有些繁琐。毕竟给每个函数都做一层嵌套,要浪费很多行数。下面就来解决这个问题。
解决
先贴代码
/**
* 转换类似dosomething(
* params-1,params-2,..,successHandler,errorHandler,params-n,...
* ) 为promise形式
* promisify(dosomething,[params-1,params-2,Promise,params-n,...]).then(...)
* 其中 [Promise,params-1,params-2,...] 等价于 [params-1,params-2,...]
* @param method
* @param paramsv
* @param scope
* @returns {Promise<any>}
*/
promisify(method,params,scope){
let index = params.indexOf(Promise);
if(index<0) {
index = 0;
}
return new Promise((resolve,reject)=>{
params.splice(index,1,resolve,reject)
method.apply(scope,params)
})
},
举个例子
-
mgr.readFile(filePath,successCallback,errorCallback, isText)
转换后promisify(readFile,[filePath,Promise,isText],mgr) .then(....) .catch(...)
-
readFile(successCallback,errorCallback,filePath,isText)
转换后promisify(readFile,[filePath,isText]) .then(....) .catch(...)