Javascript 如果我们不';不要等待
我有这个功能,可以使用给定的源播放音频,它工作正常:Javascript 如果我们不';不要等待,javascript,Javascript,我有这个功能,可以使用给定的源播放音频,它工作正常: function sfxPlay(source) { let sfxAudio = new Audio(`${source}`); sfxAudio.crossOrigin = "anonymous"; sfxAudio.play(); return new Promise((resolve) => { sfxAudio.addEventListener("ended", function () {
function sfxPlay(source) {
let sfxAudio = new Audio(`${source}`);
sfxAudio.crossOrigin = "anonymous";
sfxAudio.play();
return new Promise((resolve) => {
sfxAudio.addEventListener("ended", function () {
sfxAudio.currentTime = 0;
resolve();
});
});
}
我将在异步函数中使用它,如下所示:
await sfxPlay(source.mp3);
问题是,如果我想在不使用wait
的情况下使用函数,该怎么办?如果以后我将它与wait一起使用,是否会出现任何错误。。。当我们不等待时,承诺会发生什么
编辑:
我的意思是,如果我们在函数A中有这样的函数:
sfxPlay(source.mp3);
在函数B中这样使用它可以接受吗
await sfxPlay(source.mp3);
如果不使用wait,您仍然可以使用承诺,您只需使用
手动等待它。然后(承诺只是作为普通对象返回):
否则,如果您不使用它,默认情况下不会发生任何好的或坏的事情-承诺中的代码仍将运行,但在调用resolve
时不会发生任何事情
但是,如果调用拒绝
,则拒绝将不会得到任何处理;这很糟糕,因为它在大多数平台上都会抛出错误。因此,请确保永远不要使用reject
,除非您有匹配的.catch
(还要注意,try
/catch
语句不适用于这种特定类型的错误)。感谢@T.J.Crowder指出这一点
您可以将这两种方法混合使用,而不会产生任何问题。如果您只调用函数,而不对它返回的承诺做任何事情,则意味着它的解决结果永远不会得到处理,这可能很好,也可能是个问题。承诺可能会发生三件事(无论你是否处理):
承诺永远不会实现,在这种情况下,你不处理实现或拒绝都不重要,因为它们都没有发生。:-)
诺言实现了。那样的话,就没有问题了。这就像调用函数而不使用它返回值一样
承诺被拒绝了。这就像不处理抛出的异常一样。主机至少会向控制台或输出报告“未处理的拒绝”。某些主机可能会在此时终止您的程序。例如,当前Node.js在检测到未经处理的拒绝时会出现以下警告:
未经处理的承诺拒绝被弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程
例如,Node.js可能会在某个时候开始终止处理拒绝的程序
现在,您可能没有使用Node.js,但它并不是唯一一个以这种方式开始处理未处理拒绝的主机
因此,您可能希望使用承诺,至少是捕捉错误。如果您的调用在async
函数中,await
将执行此操作,但也会阻止await
函数中的async
函数的承诺结算。在非async
函数中,或在不想等待结算的async
函数中,在承诺上使用catch
:
sfxPlay(source).catch(()=>{
/* ...handle/report the error (or just suppress it, if that's appropriate
[which it sometimes, though rarely, is])...
*/
});
这就像问如果不赋值函数返回的对象会发生什么。垃圾收集器刚刚把它清理干净。不使用wait,就会返回一个承诺,你可以根据需要使用它。@foxer真棒,我很高兴能帮上忙!如果这解决了您的问题,请您使用我答案左侧的复选标记图标将其标记为已接受?“…不会发生任何好的或坏的情况…”这取决于您对“坏”的定义。如果承诺被拒绝,并且没有任何内容处理拒绝,主机将在控制台/输出中报告未经处理的拒绝。当Node.js看到未经处理的拒绝时,它当前会说“未经处理的承诺拒绝已被弃用。将来,未经处理的承诺拒绝将使用非零退出代码终止Node.js进程。”例如,在某个时刻,Node.js可能会在未经处理的拒绝时终止——肯定是“坏的”:-)@foxer-请看我上面的便条。您可能没有使用Node.js(或Deno,Ryan Dahl和crew提供的最新版本),但对于任何使用Node.js的人,…。@T.J.Crowder干杯,感谢您指出这一点。我更新了答案,注意到
sfxPlay(source).catch(()=>{
/* ...handle/report the error (or just suppress it, if that's appropriate
[which it sometimes, though rarely, is])...
*/
});