socket.io - 套接字等待承诺
socket.io - socket.on wait for promise
我有一个按钮,可以与服务器进行一些通信,以检查输入的值(通过输入框)是否已存在。代码如下:
$("#button").click(function () {
var exists = false;
var name = $("#name").val();
socket.emit("check", name);
socket.on("checkReturn", function (data) {
exists = data.result;
});
if (exists) {
console.log("exists")
} else {
if (name.length > 0) {
socket.emit("create", name);
}
}
});
});
问题是checkReturn
调用是异步的,因此代码继续运行而无需实际等待结果。如何确保首先完成checkReturn
,然后执行其余代码?
除了其他答案之外,您还可以使用确认,其中回调在客户端和服务器之间传递。然后你可以只使用 emit 函数的回调:
$("#button").click(function() {
var exists = false;
var name = $("#name").val();
socket.emit('check', name, function (data) {
exists = data.result;
if (exists) console.log("exists");
else (if (name.length > 0) socket.emit("create", name));
});
});
在服务器端,它看起来像这样:
io.sockets.on('connection', function (socket) {
socket.on('check', function(name, fn) {
// find if "name" exists
fn({ exists: false });
});
});
@hexacyanide aswer 的替代方案可以像这样完成:
$("#button").click(async function() {
var exists = false;
var name = $("#name").val();
exists = await new Promise(resolve => socket.emit('check', name, data => resolve(data.result)))
if (exists) console.log("exists");
else (if (name.length > 0) socket.emit("create", name));
});
套接字发出包装在 promisse 中,因此它可以等待回调,并避免嵌套在多个大括号内。
不是那么优雅,但如果将代码封装在单独的函数中,可以使代码更易于阅读:
function check(name){
return new Promise(resolve => socket.emit('check', name, data => resolve(data.result)))
}
并像这样使用:
$("#button").click(async function() {
var exists = false;
var name = $("#name").val();
exists = await check(name)
if (exists) console.log("exists");
else (if (name.length > 0) socket.emit("create", name));
});
$("#button").click(function ()
{ var exists = false;
var name = $("#name").val();
socket.emit("check", name);
socket.on("checkReturn", function (data) {
exists = data.result;
if (exists) { console.log("exists") } else { if (name.length > 0) { socket.emit("create", name); } } });
});
您可以使用
socket.io.wait从 socket.io 获取同步响应:
https://www.npmjs.com/package/socket.io.wait
$("#button").click(async function ()
{
var exists = false;
var name = $("#name").val();
let exists = await socket.emitWait("check", name);
if (exists == true)
{
console.log("exists");
}
else
{
if (name.length > 0)
{
socket.emit("create", name);
}
}
});
相关文章:
- 等待循环调用的所有承诺完成
- RxJS等待承诺解决
- 余烬后渲染不等待承诺
- 如何在恢复函数之前等待 JavaScript 承诺解析
- 和Mocha一起等待未兑现的承诺
- 等待承诺
- socket.io - 套接字等待承诺
- 为什么 .then() 不等待承诺
- Javascript/Angularjs :等待承诺实现,然后再进入foreach Loop中的下一次迭代
- 等待承诺
- 使用Ember(cli),我如何获得一个等待承诺的验收测试
- 如果我屈服于承诺,它会等待承诺得到解决后再继续吗
- Do量角器's期望在内部等待承诺
- 等待承诺链中的所有承诺
- 如何在量角器/茉莉测试中等待承诺
- while(true)循环中的承诺/等待承诺解决
- 函数用于等待承诺和检索结果
- 用不同的方法等待承诺
- 等待承诺 - 角度 2.
- 在等待承诺的同时切换 AngularJS 视图