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