使用 promise 代替事件回调
Using promise instead of events Call back
我有以下代码,所有代码都在指定函数 myFunc
中实现,我需要所有函数完成 (myFunc
) 即当文件被提取时 successfully/or 不是 return 某些状态(成功/错误)。
var myFunc = () => {
var DecompressZip = require('decompress-zip');
var unzipper = new DecompressZip(filename)
unzipper.on('error', function (err) {
console.log('Caught an error');
});
unzipper.on('extract', function (log) {
console.log('Finished extracting');
});
unzipper.on('progress', function (fileIndex, fileCount) {
console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount);
});
unzipper.extract({
path: 'some/path',
filter: function (file) {
return file.type !== "SymbolicLink";
}
});
};
由于这个开源正在处理事件,这是一个问题(要获得 return 状态...)我打算将其更改为通过 promisify 或 promise
如下所示:
var myFunc = () => {
return new Promise(function(resolve, reject) {
var DecompressZip = require('decompress-zip');
var unzipper = new DecompressZip(filename)
unzipper.on('error', function (err) {
console.log('Caught an error');
reject();
});
unzipper.on('extract', function (log) {
console.log('Finished extracting');
resolve();
});
unzipper.on('progress', function (fileIndex, fileCount) {
console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount);
});
unzipper.extract({
path: 'some/path',
filter: function (file) {
return file.type !== "SymbolicLink";
}
});
};
我的问题是:
- 因为我不太精通 JS 将事件转换为 promise 有意义吗?
- 还有其他
我可以将其用于用例的好解决方案?
只有当您绝对肯定 "end" 事件只会触发一次时,将事件转换为承诺才有意义。
所以在这种情况下,是的,你对实施的建议应该有效(假设我正确理解你的代码)。
1) 是的,将此类事件转换为 Promise 非常有意义。目前,不同的库有不同的事件表达方式(事件、消息、回调函数、然后是错误回调函数、异常、错误代码等等)。 Promises 将很快统一所有这些,现在它们是 Javascript 标准。因此,在您正在使用的库周围放置一个 Promise 层并在您的代码中仅使用 Promise 而不是旧的混乱是一个很好的做法。
2) 我觉得你的解决方案不错。
我有以下代码,所有代码都在指定函数 myFunc
中实现,我需要所有函数完成 (myFunc
) 即当文件被提取时 successfully/or 不是 return 某些状态(成功/错误)。
var myFunc = () => {
var DecompressZip = require('decompress-zip');
var unzipper = new DecompressZip(filename)
unzipper.on('error', function (err) {
console.log('Caught an error');
});
unzipper.on('extract', function (log) {
console.log('Finished extracting');
});
unzipper.on('progress', function (fileIndex, fileCount) {
console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount);
});
unzipper.extract({
path: 'some/path',
filter: function (file) {
return file.type !== "SymbolicLink";
}
});
};
由于这个开源正在处理事件,这是一个问题(要获得 return 状态...)我打算将其更改为通过 promisify 或 promise 如下所示:
var myFunc = () => {
return new Promise(function(resolve, reject) {
var DecompressZip = require('decompress-zip');
var unzipper = new DecompressZip(filename)
unzipper.on('error', function (err) {
console.log('Caught an error');
reject();
});
unzipper.on('extract', function (log) {
console.log('Finished extracting');
resolve();
});
unzipper.on('progress', function (fileIndex, fileCount) {
console.log('Extracted file ' + (fileIndex + 1) + ' of ' + fileCount);
});
unzipper.extract({
path: 'some/path',
filter: function (file) {
return file.type !== "SymbolicLink";
}
});
};
我的问题是:
- 因为我不太精通 JS 将事件转换为 promise 有意义吗?
- 还有其他 我可以将其用于用例的好解决方案?
只有当您绝对肯定 "end" 事件只会触发一次时,将事件转换为承诺才有意义。
所以在这种情况下,是的,你对实施的建议应该有效(假设我正确理解你的代码)。
1) 是的,将此类事件转换为 Promise 非常有意义。目前,不同的库有不同的事件表达方式(事件、消息、回调函数、然后是错误回调函数、异常、错误代码等等)。 Promises 将很快统一所有这些,现在它们是 Javascript 标准。因此,在您正在使用的库周围放置一个 Promise 层并在您的代码中仅使用 Promise 而不是旧的混乱是一个很好的做法。
2) 我觉得你的解决方案不错。