我想使用promise,但我有一个回调API,格式如下:
1.DOM加载或其他一次性事件:
window.onload; // set to callback
...
window.onload = function() {
};
2.普通回调:
function request(onChangeHandler) {
...
}
request(function() {
// change happened
...
});
3.节点样式回调(“nodeback”):
function getStuff(dat, callback) {
...
}
getStuff("dataParam", function(err, data) {
...
})
4.具有节点样式回调的整个库:
API;
API.one(function(err, data) {
API.two(function(err, data2) {
API.three(function(err, data3) {
...
});
});
});
我如何在promise中使用API,如何“promise”它?
在Node.js 8.0.0的候选版本中,有一个新的实用程序util.profisify(我已经写过util.proficify),它封装了promising任何函数的能力。
它与其他答案中建议的方法没有太大不同,但具有作为核心方法而不需要额外依赖性的优点。
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
然后有一个readFile方法,它返回一个本机Promise。
readFile('./notes.txt')
.then(txt => console.log(txt))
.catch(...);
在Node.js 8中,您可以使用此npm模块动态地promisify对象方法:
https://www.npmjs.com/package/doasync
它使用util.provify和代理,使对象保持不变。Memoization也使用WeakMaps完成)。以下是一些示例:
使用对象:
const fs = require('fs');
const doAsync = require('doasync');
doAsync(fs).readFile('package.json', 'utf8')
.then(result => {
console.dir(JSON.parse(result), {colors: true});
});
具有以下功能:
doAsync(request)('http://www.google.com')
.then(({body}) => {
console.log(body);
// ...
});
您甚至可以使用本机调用和应用来绑定某些上下文:
doAsync(myFunc).apply(context, params)
.then(result => { /*...*/ });