如何在完成回调之前停止JS函数的完成

时间:2018-01-11 14:35:08

标签: javascript

这是我的情况:

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

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

我需要的是像

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

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

但是JS并没有这样做。为实现类似的目标,我能做的最好的事情是什么?

2 个答案:

答案 0 :(得分:1)

你应该使用Promises:

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,然后它将被解析并调用其中的函数。当您使用该字符串解析时,value将是“某个值”。

更多相关信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

答案 1 :(得分:0)

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

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);