node.js中的回调真的很纠结。我:
server.js (abriged):
const classjs = require('./Class.js');
let clients = new classjs.clients();
let test = clients.getid(ws);
console.log(test);
返回undefined。我有
Class.js:
class clients{
constructor(){
this.WebSocket = [];
}
add(ws){
this.WebSocket.push(ws);
return this.WebSocket.length-1;
}
getid(ws){
let i=0;
this.WebSocket.forEach(element => {
if(ws == element){
console.log("true");
console.log(i);
return i;
}
i++;
});
}
}
我可以看到索引击中返回,但它显示为未定义,因为我认为是node.js的异步特性。
这里使用promise或callback会更好吗?我该如何实现呢?
这段代码中没有任何异步内容。问题是.forEach()
不支持父函数的早期返回。当您执行return i
时,您将从.forEach()
回调返回,而不是从getid()
函数返回。return i
所做的只是完成当前的迭代。它不会停止其余的迭代,也不会从父函数返回任何内容。
这是.forEach()
本质上过时的另一个原因。我再也不用它了,因为它的控制流选项比普通的for
循环少得多。将代码切换为普通的for
循环,然后return i
将正常工作。
getid(ws){
for (let [i, element] of this.WebSocket.entries()) {
if (ws === element) {
return i;
}
}
}
或者,您可以使用.indexOf()
,让它为您搜索数组:
getid(ws){
return this.WebSocket.indexOf(ws);
}
如果没有找到,将返回-1
。