gpt4 book ai didi

javascript - 在 for 循环中的异步函数调用中有条件地执行回调

转载 作者:搜寻专家 更新时间:2023-11-01 00:03:24 25 4
gpt4 key购买 nike

我正在开发一个函数,该函数遍历端口列表并在其中一个端口可用时调用其回调。我不想等待每个端口响应,而是想在所有端口上调用 checkPortStatus 函数,并在第一个端口返回可用时返回。

下面是可在 node.js 中运行的示例代码:

    // Check if a port is open (in use) or closed (available)
function checkPortStatus(port, callback) {
// Simulates real world checking of response from port by returning
// after a random time.
setTimeout(function() {
// Simulates a few closed ports
if (port === 3005 || port === 3006 || port === 3007) {
callback('closed')
}
// Simulates a few open ports
else {
callback('open')
}
}, Math.floor(Math.random() * 200))
}

// Calls callback once any available port is found
function findAnAvailablePort(startPort, endPort, callback) {
var check = function(port) {
checkPortStatus(port, function(status) {
// If a port is 'closed', it's considered available
if (status === 'closed') {
callback(port)
}
})
}
for (var port = startPort; port <= endPort; port++) {
check(port)
}
}

findAnAvailablePort(3000, 3010, function(port) {
console.log('AVAILABLE PORT: ' + port)
});

// Don't exit Node, wait for a response
setTimeout(function() { console.log('FIN') }, 5000)

运行代码的结果:

AVAILABLE PORT: 3005
AVAILABLE PORT: 3007
AVAILABLE PORT: 3006

两个问题:

  1. 如何只调用一次回调?我只想返回匹配的第一个端口。
  2. 如何检查是否所有函数回调都已返回?在此示例中,我需要在所有 checkPortStatus 返回端口不可用时返回。

最佳答案

在函数外初始化一些变量应该可以解决问题:

// Calls callback once any available port is found
var hasFoundPort = false;
var checkedPorts = 0;
function findAnAvailablePort(startPort, endPort, callback) {
var check = function(port) {
checkPortStatus(port, function(status) {
checkedPorts++;
// If a port is 'closed', it's considered available
if (status === 'closed' && !hasFoundPort) { // only execute callback once
callback(port)
hasFoundPort = true;
}
if(checkedPorts == endPort - startPort + 1) // checked all ports
console.log('finished checking');
})
}
for (var port = startPort; port <= endPort; port++) {
check(port)
}
}

关于javascript - 在 for 循环中的异步函数调用中有条件地执行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7020371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com