我重构了一个简单的实用程序来使用promise。它从网络上获取PDF并将其保存到磁盘。然后,它应该在保存到磁盘后在pdf查看器中打开文件。该文件出现在磁盘上,并且是有效的,shell命令打开OSX预览应用程序,但弹出一个对话框,抱怨该文件是空的。
文件流写入磁盘后,执行shell函数的最佳方式是什么?
// download a pdf and save to disk
// open pdf in osx preview for example
download_pdf()
.then(function(path) {
shell.exec('open ' + path).code !== 0);
});
function download_pdf() {
const path = '/local/some.pdf';
const url = 'http://somewebsite/some.pdf';
const stream = request(url);
const write = stream.pipe(fs.createWriteStream(path))
return streamToPromise(stream);
}
function streamToPromise(stream) {
return new Promise(function(resolve, reject) {
// resolve with location of saved file
stream.on("end", resolve(stream.dests[0].path));
stream.on("error", reject);
})
}
字符串
5条答案
按热度按时间eyh26e7m1#
在这一行
字符串
你正在立即执行
resolve
,调用resolve
的result(它将是undefined的,因为这是resolve
返回的)被用作stream.on
的参数-这根本不是你想要的,对吧。.on
的第二个参数需要是一个 * 函数 *,而不是调用函数的结果因此,代码需要
型
或者,如果你是老派的:
型
另一种老派的方法是
stream.on("end", resolve.bind(null, stream.dests[0].path));
个不,不要这样做:P查看评论
vxqlmq5t2#
经过一系列的尝试,我找到了一个解决方案,它的工作一直很好。更多信息请参见JSDoc注解。
字符串
使用示例:
型
**更新。**我已经将上面的函数发布为Node模块:http://npm.im/promisified-pipe
ckocjqey3#
流承诺API
v15新增的这个API提供了
stream.finished
:字符串
https://nodejs.org/api/stream.html#stream_event_finish
332nm8kg4#
另一个解决方案可能看起来像这样:
字符串
你可以像这样使用它:
型
o2g1uqev5#
使用promised pipeline函数可以很好地做到这一点。管道还提供了额外的功能,比如清理流。
字符串