将基于Promise的函数转换为同步函数

时间:2017-02-02 15:13:17

标签: javascript node.js promise mocha

我有一个函数从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>

1 个答案:

答案 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;
  });

或者如果您知道端口或它始终相同,也许您可​​以在测试中对其进行硬编码。