应用程序需要一致检查是否有多个服务器可用。我希望定期在后台执行此操作,只要我需要知道连接状态时,只需检查上一次检查的状态即可。能够像使用其他语言一样同步使用套接字将很有帮助,这样我的定期异步函数就不会运行自己的异步函数,并且因为就我而言,任何成功的服务器都足以胜任。成功状态。不应再检查其他任务,也不应仅因为其中一个异步任务不好而将其他状态设置为坏。
当前异步情况
function checkServersPeriodically() {
var servers = [{'host': 'localhost', port: 80}, {'host': 'localhost', port: 95}];
for (var i = 0; i < servers.length; i++) {
someAyncFunction(servers[i].host, servers[i].port, (err) => {
//could have two async checks with different outcomes
if (err) bad();
else good();
});
}
}
我在寻找什么(类似于如果我要使用某种文件系统检查,我只会使用fs.readSync)
function checkServersPeriodically() {
var servers = [{'host': 'localhost', port: 80}, {'host': 'localhost', port: 95}];
for (var i = 0; i < servers.length; i++) {
try {
someSyncFunction(servers[i].host, servers[i].port);
good();
return; // Skips the other checks
}
}
bad();
}
答案 0 :(得分:1)
这可以通过async..await
方便地处理,该const { promisify } = require('util');
const somePromiseFunction = promisify(someAyncFunction);
async function checkServersPeriodically() {
var servers = [{'host': 'localhost', port: 80}, {'host': 'localhost', port: 95}];
for (var i = 0; i < servers.length; i++) {
try {
await somePromiseFunction(servers[i].host, servers[i].port);
good();
return; // Skips the other checks
} catch (err) {}
}
bad();
}
为承诺提供类似同步的控制流:
checkServersPeriodically
good
返回一个承诺。像async function checkServersPeriodically() {
var servers = [{'host': 'localhost', port: 80}, {'host': 'localhost', port: 95}];
for (var i = 0; i < servers.length; i++) {
try {
await somePromiseFunction(servers[i].host, servers[i].port);
return; // Skips the other checks
} catch (err) {}
}
throw new Error('no servers');
}
checkServersPeriodically().then(good, bad);
和bad`这样的回调有可能是基于回调的API的残余,应该在调用者函数中处理成功或失败:
<c:url var="url" value="https://${myHost}/${myEncodedString}">
<c:param name="code" value="123"/>
</c:url>