做回调或承诺

  • 本文关键字:承诺 回调 node.js
  • 更新时间 :
  • 英文 :


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

最新更新