Javascript 将基于承诺的函数转换为同步函数

Javascript 将基于承诺的函数转换为同步函数,javascript,node.js,promise,mocha.js,Javascript,Node.js,Promise,Mocha.js,我有一个函数,它从npm包返回一个promisegetPort() 我需要更改这个,这样我就可以停止代码,直到我没有值为止。比如: var port = getPortSync() 我不能使用生成器或wait/async,因为代码实际上不在函数中 基本上,我想在node中执行类似于readFileSync的操作 我这样做的原因是,我有一系列mocha测试,其中变量在文件顶部声明,我需要在声明/初始化这些变量之前检索自由端口值,我想更改最小行数 我目前的尝试是: var getPortSync

我有一个函数,它从npm包返回一个promise
getPort()

我需要更改这个,这样我就可以停止代码,直到我没有值为止。比如:

var port = getPortSync()
我不能使用生成器或wait/async,因为代码实际上不在函数中

基本上,我想在node中执行类似于
readFileSync
的操作

我这样做的原因是,我有一系列mocha测试,其中变量在文件顶部声明,我需要在声明/初始化这些变量之前检索自由端口值,我想更改最小行数

我目前的尝试是:

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
  }

不幸的是,你的方法是不可能的

那里的代码总是有一个无限循环,因为端口的分配是异步进行的,
循环是一个同步构造

如果从包中打开代码,则获取端口的方式是通过异步回调:

server.listen(0, function () {
  var port = server.address().port;
  // ...
});
代码的主要部分只有在服务器发出
侦听
事件后才具有端口信息,这意味着无法同步获取此信息

也许您可以将测试包装在承诺的
中,然后

getPort().then((port) => {
  // your test code
});
您还可以使用mocha的测试挂钩(它与promises配合得很好)在测试块之前获得端口:

describe('my-test', function() {

  let port;
  before(() => getPort().then((p) => {
    port = p;
  });

或者,如果您知道端口或端口总是相同的,也许您可以在测试中硬编码它。

不幸的是,您的方法是不可能的

那里的代码总是有一个无限循环,因为端口的分配是异步进行的,
循环是一个同步构造

如果从包中打开代码,则获取端口的方式是通过异步回调:

server.listen(0, function () {
  var port = server.address().port;
  // ...
});
代码的主要部分只有在服务器发出
侦听
事件后才具有端口信息,这意味着无法同步获取此信息

也许您可以将测试包装在承诺的
中,然后

getPort().then((port) => {
  // your test code
});
您还可以使用mocha的测试挂钩(它与promises配合得很好)在测试块之前获得端口:

describe('my-test', function() {

  let port;
  before(() => getPort().then((p) => {
    port = p;
  });

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

两个问题:首先,为什么不在返回的承诺的
中进行摩卡测试?第二,你的尝试有效吗?对不起,我忘了说它无效。我把它放在这里只是为了让大家知道我需要什么。两个问题:首先,为什么不在返回的承诺的
中进行摩卡测试,然后在
中进行测试?第二,你的尝试有效吗?对不起,我忘了说它无效。我写这封信只是想告诉你我需要什么,你也可以信守诺言<代码>让我们承诺;在(()=>portPromise=getPort()之前)
。然后,在您的测试中,您将从
portPromise开始。然后((port)=>{…})
。基本上,端口总是相同的,但它用于启动服务器。所以现在,如果您单独运行测试,我的测试就可以工作,但如果您同时运行测试,则无法工作!。我们不希望使用随机数来避免冲突,也不希望每次测试都手动更改它们。您建议的方法(将代码移动到.then中)是我现在正在做的,但它很长,我试图找到一种方法来避免它:)@jurgo是的,不幸的是,您必须解决javascript的异步特性。Async/await可能会提供最干净的代码,因为它看起来几乎是同步的,但由于您无法使用它,唯一的其他方法是直接通过承诺。您也可以坚持承诺<代码>让我们承诺;在(()=>portPromise=getPort()之前)
。然后,在您的测试中,您将从
portPromise开始。然后((port)=>{…})
。基本上,端口总是相同的,但它用于启动服务器。所以现在,如果您单独运行测试,我的测试就可以工作,但如果您同时运行测试,则无法工作!。我们不希望使用随机数来避免冲突,也不希望每次测试都手动更改它们。您建议的方法(将代码移动到.then中)是我现在正在做的,但它很长,我试图找到一种方法来避免它:)@jurgo是的,不幸的是,您必须解决javascript的异步特性。Async/await可能会提供最干净的代码,因为它看起来几乎是同步的,但由于您无法使用它,所以唯一的其他方法是直接通过承诺。