Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析等待消息到达_Javascript_Jquery_Async Await - Fatal编程技术网

Javascript 解析等待消息到达

Javascript 解析等待消息到达,javascript,jquery,async-await,Javascript,Jquery,Async Await,我有一些JS中的websocket代码。我有这样一个消息处理循环: socket.addEventListener('message', function (event) { payload = JSON.parse(event.data) method = payload.method // Dispatch messages if (method == 'cmd1') { handle_cmd1(payload); // trigger event/semapho

我有一些JS中的websocket代码。我有这样一个消息处理循环:

socket.addEventListener('message', function (event) {
  payload = JSON.parse(event.data)
  method = payload.method
  // Dispatch messages
  if (method == 'cmd1') { 
    handle_cmd1(payload);  // trigger event/semaphore here to wait up waiter
  }
  else if (method == 'cmd2') { ... }
});
$('#my-button').change(function() {
  handle_button();
});
async function handle_button() {
  send_msg('msg1', 'hi');
  // wait for server to reply with cmd1
  cmd1_data = await something(); // what?
  alert(`cmd1 data: $(cmd1_data)`);
}
在其他地方,我有这样一个按钮回调:

socket.addEventListener('message', function (event) {
  payload = JSON.parse(event.data)
  method = payload.method
  // Dispatch messages
  if (method == 'cmd1') { 
    handle_cmd1(payload);  // trigger event/semaphore here to wait up waiter
  }
  else if (method == 'cmd2') { ... }
});
$('#my-button').change(function() {
  handle_button();
});
async function handle_button() {
  send_msg('msg1', 'hi');
  // wait for server to reply with cmd1
  cmd1_data = await something(); // what?
  alert(`cmd1 data: $(cmd1_data)`);
}
这个想法是,按钮发送“msg1”,服务器应该回复“cmd1”和一些信息。我想等待回复,然后再做一些事情。 所以我的问题是,如何把这些联系起来?在C++中,我会使用信号量。我宁愿不旋转环;Javascript/JQuery中有什么东西可以用来触发并等待这样的用户定义事件吗?我对JS有点陌生,对JS async/await也很陌生

编辑:我制作了一个简单的jsfiddle来显示我的目标。 something()应该是一个返回promise()的方法,或者应该是另一个也用async表示的方法

function something(){
返回新承诺(解决、拒绝){
//…打电话给你的数据库
//然后
解决(结果)
//或
拒绝(错误)
}

}
现在我了解了Javascript中的承诺是如何工作的,下面是一个可以通过调用函数从任何地方唤醒承诺的工作示例:

wakeup = null;

// returns a promise that will be resolved by calling wakeup()
// (could be a list of these or whatever, this is just a simple demo)
function wakeable() {
    return new Promise( (resolve) => {
        wakeup = () => { resolve(true); }
    });
}

// demo of waiting and getting woken up:
async function handle_event() {
    while (true) {
        console.log("waiting...")
        await wakeable(); // returns to event loop here
        console.log("handle event woke up!");
    }
}

handle_event(); // start in "background"
wakeup(); // wake it up
setTimeout(_ => { wakeup(); }, 500); // wake it up again after a delay
这里发生的事情是,当您调用
wakeable()
时,它会返回一个承诺。该承诺由一个匿名函数构造(将
resolve
作为arg的函数);promise构造函数同步调用该函数,并将promise的resolve方法传递给它。在本例中,该函数将
唤醒
设置为调用原始
解析
的另一个匿名函数;它是一个闭包,因此即使稍后调用它,它也可以访问该解析函数。然后它返回新的承诺

在本演示中,我们将
等待该承诺;这会将挂起的承诺放入队列,保存当前函数状态,并返回,就像生成器调用
yield
一样

承诺在其解析函数被调用时被解析;在本例中,调用
wakeup()
调用承诺的内部resolve()方法,该方法触发任何
。然后在Javascript事件循环的下一个勾号上调用
方法(使用上面提到的承诺队列)。这里我们使用
wait
,但是
。然后(…)
将以同样的方式工作'

所以没有魔法;I/O和超时承诺的工作方式相同。当I/O事件或超时发生时,它们保留要调用的函数的私有注册表,这些函数调用承诺的resolve(),该函数触发
。然后()
或满足
等待


顺便说一句,与python中的async不同,在Javascript中,在进程退出时保留一个挂起的承诺“打开”是完全正确的,事实上,这个演示就是这样做的。当没有更多的代码运行时,它就会退出;while循环仍在“等待”这一事实并不能保持进程运行,因为它实际上只是一些存储在队列中的闭包。事件循环是空的,因此进程退出(假设它在node.js中——在浏览器中,它只是返回到等待事件)。

我认为您可以通过promiseWhere定义了
send\u msg
来解决它?您可以让它返回返回消息的承诺(在套接字返回消息时解析承诺)。然后您可以使用
cmd1_data=wait send_msg('msg1','hi')听起来您需要在您的计算机上注册一个侦听器队列socket@HereticMonkey:现在send_msg只是
socket.send(JSON.stringify({'method':method,'params':params}))其中套接字是WebSocket。我很乐意让它为返回消息返回一个承诺,但问题是一样的:什么能实现这个承诺?如何从消息处理程序循环中通知该承诺?为套接字实现一个EventEmitter,您可以执行类似于
等待新承诺(res=>methods.once(“cmd1”,res))确定,但是如何在事件循环处理程序(
handle\u cmd1
)中获取代码来解析该承诺?