使用 promise.then 时是否可以留在单击事件调用堆栈中?

Is it possible to stay inside a click event call stack when using promise.then?

音频元素上的 play() 方法必须由用户启动的事件触发,但我的点击事件中使用的 .then 似乎破坏了调用堆栈。在这种情况下我必须使用 .then

ng-click 在其控制器中调用 open(file),这只是我的 "player" 服务对 open() 的引用。

open() 来自 "player" 服务:

this.open = function(file){
  storage.getUrl(file)
    .then(function(url){
      audio.playUrl(url);
    });
};

getUrl() 只是 returns 一个字符串承诺。

playUrl() 来自 "audio" 服务:

function playUrl(url){
  audio.src = url;
  audio.play();
};

现在我可以 audio.play() 通过 "audio" 服务中不使用任何承诺的另一种方法。我可以从 open() 开始这项工作吗?

Is it possible to stay inside click event call stack when using promise.then?

在这种情况下不是。如果 promise 同步完成是可能的,但通常 promise 用于将异步完成的情况,这里就是这种情况。

相反,您需要在 点击发生之前 完成 storage.getUrl 部分(预加载),这样您就可以在用户事件期间播放。