处理调用可能不再可用的变量的异步函数的最佳做法是什么?

时间:2013-05-01 15:59:18

标签: javascript

如果标题令人困惑,我道歉。

我的情况是用户可以打开/关闭对话框。

打开对话框时会调用一系列异步函数(在webworkers中)。

当这些操作完成后,用户仍然可以关闭对话框。

我们清理了大量与相关对话框相关的变量和数据,这意味着当工人返回所需的变量时,它将不再可用。

这很好,因为我们不再需要工作人员的结果,但当然,如果快速关闭对话框,它会抛出一个javascript错误。

处理此问题的最佳做法是什么?我应该将整个事情放在try / catch语句中吗?

请注意:这个问题不是针对webworkers的(我知道我可以使用worker.terminate)所以请一般围绕异步函数构建任何答案。

提前致谢。

修改

这就是我的意思:

EXAMPLE.dialog = {
               init : function(){
                           this.cache = {
                                    //imagine lots of properties listed here
                           }
                           this.buildDialog();
               }
               buildDialog : function(){
                            //The dialog is built here

                           startFunctions();
               }
               startFunctions : function(){
                          //Perform several asynchronous functions here
                          //All of which reference this.cache.properties when they return
               },
               destroyDialog : function(){
                           //Dialog gets destroyed in DOM
                           delete this.cache;
               }       

}

解决方案:在输入此示例时愚蠢地实现了一个非常简单的解决方案,不需要使用try/catch。通过在一个父属性(在本例中为this.cache)下构造所有必需的属性,我可以简单地检查返回的异步函数中是否存在一个属性。

以前,这些属性并非以这种方式构建,这意味着检查每个属性将是乏味和膨胀的。我很抱歉没有早日意识到这一点。

以上代码对任何人来说都应该作为解决方案,而不是问题的一个例子。

2 个答案:

答案 0 :(得分:2)

为什么不创建一个代表工作者函数是否有写入结果的中间状态的中间状态,而不是担心您可能会或可能不会设置单个对象属性?在您的具体示例中,这是由对话框是否打开来控制的。

从您的描述中我理解为:

  • 如果对话框已打开 - 返回的工作人员将填充一些对象属性
  • 如果关闭对话框 - 返回的工作人员将不会填充某些对象属性

因此,工作人员的回调/返回功能首先要确定是否允许他们填充数据 - 这是由对话框状态决定的。如果它是开放的,你可以填充 - 如果它被关闭你可以定义一些其他的行为。

我认为最好的目标是不将对话框耦合到工作人员标志的通用解决方案,这样如果GUI的规则在将来发生变化,您没有直接查找工作程序功能在对话框状态。

答案 1 :(得分:-1)

嗯,只检查变量是否存在?