等待异步电话结束-太迟了

Wait for asyn call to finish - too late

本文关键字:太迟 结束 异步 电话 等待      更新时间:2023-09-26

我有一个带有按钮的对话框。单击按钮后,调用一个async方法,根据发布的数据是否有效返回true或false。click事件调用下面的方法。现在,问题是在回调函数执行之前调用了closeDialog !!我该怎么做呢?

感谢
close: function (srcCmd) {
   var closeResult = true;
   asyncThing(function(result) {
      if (result)
         closeResult = true;
      else
         closeResult = false;
   }); 
   if (closeResult !== false) {
       this.closeDialog();
   }
},

你应该考虑使用promise。JQuery Ajax调用原生返回一个Promise。

,

$.ajax(ajaxObj).success(function(resp) { console.log('I have completed');});

将对话框靠近呼叫的成功或失败部分。

根据你的代码片段,它看起来应该是这样的:

close: function (srcCmd) {
   var closeResult = true;
   asyncThing(function(result) {
      if (result)
         this.closeDialog();
   }); 
},

在你的版本中这个代码

if (closeResult !== false) {
    this.closeDialog();
}

在asyncThing的回调被调用之前被调用。这就是为什么对话框closeDialog被称为

asyncThing中的函数在异步调用完成时(无论何时)被调用。所以这不会逐行解释。

将后一个if问题移到回调函数中,就可以了。

close: function (srcCmd) {
   var closeResult = true;
   asyncThing(function(result) {
       if (result)
           closeResult = true;
       else
           closeResult = false;
    if (closeResult !== false) {
       this.closeDialog();
    }
  });
},

这是因为这段代码的异步部分是回调函数。你在同步部分调用close dialog,它在请求发送后立即运行。只需将调用移动到回调。

如前所述,您还需要在回调函数中处理this,因为js在运行时确定this。所以它并不总是指向你的对象。

一种方法是将this缓存到回调之外的另一个变量中。

close: function (srcCmd) {
   var self = this;
   var closeResult = true;
   asyncThing(function(result) {
      if (result)
         closeResult = true;
         self.closeDialog();
      else
         closeResult = false;
   }); 
},

另一种方法是使用其中一个绑定方法(。Bind, call, apply):

close: function (srcCmd) {
   var closeResult = true;
   asyncThing(function(result) {
      if (result)
         closeResult = true;
         this.closeDialog();
      else
         closeResult = false;
   }.bind(this)); 
},

还有一个Promise模式用于处理async。但是很难正确使用。