Javascript 如何在执行回调之前阻止JS函数完成

Javascript 如何在执行回调之前阻止JS函数完成,javascript,Javascript,这就是我的情况: 我在一个提供有限API的webapp的范围内工作。该应用程序有标签,并提供了一个“标签关闭”事件,我可以在自己的JS中收听。问题是,每当用户关闭选项卡时,我都需要调用一个异步函数来存储一些数据,但是因为一旦事件侦听器完成,选项卡(以及我的JS代码)就会消失,所以我的回调函数和我的操作结果永远不会运行 setTimeout不起作用,因为它只是另一个回调,并且也不会阻止侦听器完成 我需要的是 var end = false; saveStuff(function(res

这就是我的情况:

我在一个提供有限API的webapp的范围内工作。该应用程序有标签,并提供了一个“标签关闭”事件,我可以在自己的JS中收听。问题是,每当用户关闭选项卡时,我都需要调用一个异步函数来存储一些数据,但是因为一旦事件侦听器完成,选项卡(以及我的JS代码)就会消失,所以我的回调函数和我的操作结果永远不会运行

setTimeout
不起作用,因为它只是另一个回调,并且也不会阻止侦听器完成

我需要的是

   var end = false;
   saveStuff(function(result){
       if(result.ok){
           end=true;
       }
   });

   while(!end) {
     //Do nothing until callback has returned
   }

但是JS不是这样工作的。为了实现类似的目标,我能做的下一件最好的事情是什么?

你应该使用承诺:

var end = false;
var promise = new Promise(function(resolve, reject) {
    saveStuff(function(result){
        if(result.ok){
            resolve("some value");
        }
    });
});

promise.then(function(value){
// do stuff
});
承诺将一直挂起,直到您调用resolve,然后它将被解析并在其中调用函数。值将是使用该字符串解析时的“某个值”


更多信息:

一种方法是使用自定义事件:

var event = new Event('myfunctioncompleted');

saveStuff(function(result){
   if(result.ok){
       // Dispatch the event.
       elem.dispatchEvent(event);           
   }
});

// Listen for the event.
elem.addEventListener('myfunctioncompleted', function (e) { 
   // do the things after event.
}, false);

除了使用承诺之外,您确定不能将“回调后必须做什么”放在回调的末尾吗?这是不可能的
onbeforeunload
必须是一个同步函数,不能在其中执行任何异步操作。这些选项卡是实际的浏览器选项卡,还是显示/隐藏div的某种模拟形式?“制表符关闭”事件是否为您可以防止/停止的实际事件?也许你可以把要做的工作转到另一个选项卡上?还是使用服务人员?