如何对node-ftps命令进行Promisify改造以支持async/await调用
问题:node-ftps方法Promisify改造后运行不生效原因排查
我正在尝试对node-ftps的方法进行Promisify改造,以便使用async/await语法进行调用,参考了GitHub该项目issue区的说明评论编写了如下代码,但运行未生效,请问问题出在哪里?
我编写的promisify函数代码如下:
const ftpGetFile = async (ftps, source, destination) => { console.log(`FTP MGET ${source} => ${destination}`) return ftps.raw(`mget -e -O ${destination} ${source}`).exec((error, result) => { return new Promise((resolve, reject) => { if (error) { console.log("ftp fget error", error) reject(error) } else { console.log("ftp fget succss", result) resolve(result) } }) }) }
调用方式如下:
for (let index = 0; index < listToSync.length; index++) { // .... await ftpGetFile(ftp, source, destination) // .... }
问题原因
你把Promise写在了exec的回调函数内部,exec方法本身不会返回Promise,你在回调里return的Promise根本不会被外层函数捕获,导致ftpGetFile返回的不是你预期的Promise对象,await自然不会生效。
修复方案
把Promise包裹在整个exec调用的外层,手动控制Promise的决议时机,修改后的代码如下:
const ftpGetFile = async (ftps, source, destination) => { console.log(`FTP MGET ${source} => ${destination}`) // 将Promise套在最外层 return new Promise((resolve, reject) => { ftps.raw(`mget -e -O ${destination} ${source}`).exec((error, result) => { if (error) { console.log("ftp fget error", error) reject(error) return } console.log("ftp fget success", result) resolve(result) }) }) }
修改后ftpGetFile会直接返回一个Promise对象,await就可以正常等待异步操作完成,循环也会按预期顺序执行。
内容的提问来源于stack exchange,提问作者ceessay
相关产品推荐
相关产品推荐

