我有一个函数从npm包https://www.npmjs.com/package/get-port返回一个promise var port = getPortSync()
。
我需要更改这个,所以我可以停止代码,直到我没有价值。像:
readFileSync
我无法使用生成器或等待/异步,因为代码实际上不在函数中。
基本上,我想在节点中执行类似var getPortSync = function() {
var port = null
getPort().then(function(freePort) {
console.log('port', freePort)
port = freePort
})
while (port === null) {
console.log('port: ', port)
}
return port
}
的操作。
我这样做的原因是我有一堆mocha测试,其中变量是在文件的顶部声明的,我需要在声明/初始化这些变量之前检索空闲端口值。我想改变最小行数。
我目前的尝试是:
<br>
答案 0 :(得分:4)
不幸的是,你的做法是不可能的。
你所拥有的代码将始终具有无限循环,因为端口的赋值是异步发生的,而while
循环是同步构造。
如果从包打开代码,它获取端口的方式是通过异步回调:
server.listen(0, function () {
var port = server.address().port;
// ...
});
代码的主要部分server.address()将仅在服务器发出listening
事件后拥有端口信息,这意味着无法同步获取此信息。
也许你可以将测试包装在承诺的then
中?
getPort().then((port) => {
// your test code
});
您还可以使用mocha的测试挂钩(与promises配合使用)在测试块之前获取端口:
describe('my-test', function() {
let port;
before(() => getPort().then((p) => {
port = p;
});
或者如果您知道端口或它始终相同,也许您可以在测试中对其进行硬编码。