' npm要求'导致承诺无法解决

时间:2018-01-17 00:07:13

标签: javascript node.js npm promise electron

我正在编写一个通过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模块?我的方法存在某种根本问题吗?我计划用这个框架做很多工作,我讨厌不理解这种行为,因为我希望它从这里变得更加复杂。

0 个答案:

没有答案