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])...
        */
    });