Tam*_*mas 7 javascript jquery node.js promise socket.io
我有一个按钮,它与服务器进行一些通信,以检查输入的值(通过输入框)是否已经存在.代码如下:
$("#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);
}
}
});
});
Run Code Online (Sandbox Code Playgroud)
问题是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));
});
});
Run Code Online (Sandbox Code Playgroud)
在服务器端,它看起来像这样:
io.sockets.on('connection', function (socket) {
socket.on('ferret', function(name, fn) {
// find if "name" exists
fn({ exists: false });
});
});
Run Code Online (Sandbox Code Playgroud)
@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));
});
Run Code Online (Sandbox Code Playgroud)
套接字发出被包装在承诺内,因此它可以等待回调,并避免嵌套在多个大括号内。
不是那么优雅,但如果将代码封装在单独的函数中,可以使代码更易于阅读:
function check(name){
return new Promise(resolve => socket.emit('check', name, data => resolve(data.result)))
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用:
$("#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));
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10333 次 |
| 最近记录: |