我正在编写一个通过adbkit模块与设备通信的Electron应用程序,还需要解析x509证书。我有一个函数在页面加载时调用,以填充包含设备信息的字段。用户也可以使用按钮调用该功能。
昨天做了一些工作之后我注意到,当页面加载时,它将不再填充设备信息,而是我必须单击按钮,在这种情况下函数将正常执行。
经过大量的调试后,我意识到我在同一个html文件包含的不同脚本(request.js)的顶部添加了var x509 = require('x509.js')
,所以我可以进行x509解析,并通过出于某种原因这样做似乎adbkit listDevices()
在devices.js
中返回的Promise似乎从未解决过。 .catch()
没有捕获任何内容,.finally()
从未执行过,它只会跳过整个事情。
然后,如果我只是在request.js中向下注释或移动x509.js的require
,那么在执行x509解析的函数内部,getDevices()
将按预期执行。
request.js:
var x509 = require('x509.js')
...various stuff
function parseCert () {
<------- if I move 'var x509 = require('x509.js') here everything works fine
...do the cert parsing
}
devices.js:
var Promise = require('bluebird')
var adb = require('adbkit')
var client = adb.createClient()
function getDevices() {
client.listDevices() <------ THIS PROMISE APPEARS TO NEVER RESOLVE
UNLESS THE BUTTON IS CLICKED OR X509 MOVED
.then(function(devices) {
return Promise.map(devices, function(device) {
return client.shell(device.id, 'echo $RANDOM')
// Use the readAll() utility to read all the content without
// having to deal with the events. `output` will be a Buffer
// containing all the output.
.then(adb.util.readAll)
.then(function(output) {
console.log('[%s] %s', device.id, output.toString().trim())
})
})
})
.then(function() {
console.log('Done.')
})
.catch(function(err) {
console.error('Something went wrong:', err.stack)
})
.finally(function() {
console.log('hi mom')
})
}
最后是index.html:
<html>
<head>
....
</head>
<body>
<script src="./devices.js"></script>
<script src="./request.js"></script>
<script>getDevices()></script>
...
<button onclick="getDevices()">Detect devices</button>
</body>
</html>
这些是简化的,但是我将自定义getDevices()
函数替换为此处显示的adbkit文档中的示例,并且它的行为方式相同,client.listDevices()
返回的承诺似乎永远无法解决。然后当我从request.js中删除var x509 = require('x509.js')
时,它按预期工作。
这有什么意义吗?有没有这样的东西作为一个有缺陷的npm模块?我的方法存在某种根本问题吗?我计划用这个框架做很多工作,我讨厌不理解这种行为,因为我希望它从这里变得更加复杂。