Javascript 以同步方式执行JS异步函数(特殊情况)

Javascript 以同步方式执行JS异步函数(特殊情况),javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我正在尝试JS,并对它的异步模型进行思考。有一个项目,我正在建设的实践。这是一个使用webRTC的简单音频呼叫应用程序 下面给出了我难以理解的一个场景: 用户A可以通过调用mute_mic使其麦克风静音。此功能如下所示: async function mute_mic(e) { let credential_payload = await retrieveOwnCred();// sensitive data, get from server, don't trust client

我正在尝试JS,并对它的异步模型进行思考。有一个项目,我正在建设的实践。这是一个使用webRTC的简单音频呼叫应用程序

下面给出了我难以理解的一个场景:

用户A可以通过调用mute_mic使其麦克风静音。此功能如下所示:

async function mute_mic(e) {

    let credential_payload = await retrieveOwnCred();// sensitive data, get from server, don't trust client

    // do other mic muting stuff

}
用户B是呼叫的主机。所以他们可以移除用户A的麦克风。为此,主机向用户B发送一个信号。然后,用户B的客户端执行以下操作:

async function leave_mic() {

    stopped = await stopPublishingStream(streamID);  
    // some other clean up

}
有时会发生这种情况:用户A正在静音他们的麦克风,而主机同时要求拿走他们的麦克风。我能看到不可预知的事情发生。也许是因为两个异步函数的执行混淆了

如果是这样,处理这种情况的最佳模式是什么?行业专家能否提供一个说明性的例子


我希望这些函数一个接一个地同步运行。但我也需要它们是异步的,因为它们内部有一个等待调用。我可以在这里使用什么策略?

在我看来,你问题的核心似乎是:

可能是因为这两个异步函数的执行 搞混了

这不应该发生。只需执行以下操作,即可轻松链接这两个功能:

await mute_mic(); 
await leave_mic();
在上述情况下,左麦克风将始终在静音麦克风后运行

我能看出这些程序不能按正确顺序运行的唯一原因是,如果您执行以下操作:

mute_mic(); 
leave_mic();
这些函数仍然是异步的,wait只是保留了顺序。这是因为async/await只是承诺的语法糖,因此您也可以将上面的内容想象为:

mute_mic()
.then(() => {
   leave_mic();
});
有关这方面的更多信息,请参阅

将其附加到按钮的onclick状态时,如何调用它

我要声明一个新函数:

function async click_handler() {
   await mute_mic(); 
   await leave_mic();
}

mute_mic_btn.onclick = click_handler;

同样,请记住这仍然是异步的,您不能直接从中返回某些内容。async/await只是为了迎合您的需求。如果您是JS的新手

您确定您的描述中的host/UserA/userB正确吗?用户B是主机,可以使用户A静音,因此主机向B发送的信号听起来不正确-如果B是主机,那么他们已经有了信号。可能是因为两个异步函数的执行混淆了?-你是问我们还是告诉我们?显示的代码没有明显的问题,到目前为止,对问题的唯一描述是不可预测的事情正在发生,因此我们无法确切说明具体失败的原因。但是我们可以向您保证,当您等待异步操作时,在该操作完成之前不会执行以下代码。直到承诺兑现。你能更具体地描述这个问题,或者提供一个更具体的例子来说明它吗;Wait leave_话筒基本上以同步顺序运行。您正在混合本地动作静音话筒,通过远程动作按钮点击触发主持人拿走话筒。这有点类似于-第二个单击事件不会等待第一个单击事件完成,因为如果两个近乎随机的事件处理程序同时尝试静音,则不会发生任何不可预测的情况。麦克风静音是幂等的。一个更有趣的情况可能是主机静音和用户取消静音几乎同时发生,但这是一个应用程序逻辑问题。这很公平,但当将其连接到按钮的onclick状态时,我该如何称呼它,即mute\u mic\u btn.onclick=mute\u mic;。我不能在这里包括Wait。此外,为了完整性,您可以添加一个关于调用Wait func与func的根本不同的解释吗?给定func在这两种情况下都是异步的。func不是异步的,async func是异步的@HassanBaig函数本质上不是异步的,当您添加async关键字时,它们将变为异步的。正如我已经解释过的,异步只是承诺的代码捷径。我建议你和我在这个答案中添加的其他链接