WebSocket连接的事件处理程序(wss.on
)被调用,将调用一个异步函数sendInitialState()
。在这里我调用了一个异步函数(getMetadata()
),它返回一个Promise,在其中我做了一些异步操作。我解决了这个承诺,调用了resolve(res)
,但是程序仍然在等待await的回应,也就是说,console.log(metadata)
从未被调用。
wss.on('connection', (ws) => {
sendInitialState();
});
const sendInitialState = async (ws) => {
console.log('Sending initial state!');
const metadata = await getMetadata();
console.log('metadata:', metadata);
};
const getMetadata = async () => {
return new Promise((resolve, reject) => {
MongoClient.connect(url, (err, db) => {
if (err) {reject(err);}
else {
db.collection("meta").findOne({type: 'a'}, (err, res) => {
if (err) reject(err);
else {
db.close();
console.log('Metadata found: ', res);
resolve(res);
}
});
}
});
});
}
我的程序为什么会阻塞?
(我尝试在外部的(ws) =>
之前添加async,但结果是相同的)
if (err) throw err
是错误的,应该改为if (err) return reject(err)
,在你使用它的两个地方都要修改。以后请注意,if (err) throw err
几乎永远不应该出现在你的代码中,我从未遇到过这是正确的错误处理情况。然后,你需要在await
周围加上try/catch
,这样可以捕获可能发生的任何错误。在这里不应忽略错误处理,当事情不像预期那样工作时,这可能是你首先应该看的问题。 - jfriend00console.log('metadata:', blockchainMetadata);
。你在日志语句中引用了错误的变量。 - jfriend00catch()
中捕获。为什么在这种情况下使用throw
是无效的?难道这只是一个性能问题,因为在throw
周围没有优化吗? - petebreject()
只是普通的函数调用,您的函数会继续执行块中的其余代码。您应该使用常规流程控制来将错误路径中要执行的代码与非错误路径分开。这是常见的JavaScript编程技巧。 - jfriend00