module.exports导出的Promise函数无法正确返回resolve问题排查
问题原因
你在addPeers的实现逻辑中,调用完异步方法lnService.addPeer后,直接执行了return resolve(),这行代码会在lnService.addPeer的回调函数触发前就提前将Promise状态修改为已完成,因此你永远无法拿到异步添加节点操作的返回结果。而reject能正常触发是因为参数校验的逻辑是同步执行的,会在提前resolve之前就运行结束。
修复方案
删除最后多余的return resolve()即可,同时可以移除Promise构造函数中不必要的async标识(你当前逻辑没有用到await,加async无实际作用)。修复后的代码如下:
module.exports = args => { return new Promise((resolve, reject) => { if (!args.pubkey) { return reject(new Error('404-ExpectedPubKey')); } if (!args.lnd) { return reject(new Error('404-ExpectedLndAuthentication')); } args.logger.info("inside this"); const lnd = args.lnd; const id = args.pubkey; const str = id.split('@'); const pubKey = str[0]; const address = str[1]; lnService.addPeer({ lnd, public_key: pubKey, socket: address }, (err, result) => { if(err) { return reject(err); } resolve(result); }); }); };
补充说明
- 所有异步操作的结果处理必须放在对应的回调逻辑中,不能在异步操作触发后直接修改Promise状态
- 建议给回调内的
reject加上return,避免异常触发后还执行后续多余逻辑
内容的提问来源于stack exchange,提问作者Nitesh
相关产品推荐
相关产品推荐

