2016-07-04 155 views
2

我有一个按钮对话框。点击按钮后,该按钮会调用一个异步方法,根据发布的数据是否有效返回true或false。 点击事件调用下面的方法。 现在,问题是在执行回调函数之前调用closeDialog! 我该如何做这项工作?等待异步通话完成 - 太晚

感谢

close: function (srcCmd) { 
    var closeResult = true; 
    asyncThing(function(result) { 
     if (result) 
     closeResult = true; 
     else 
     closeResult = false; 
    }); 

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

把'this.closeDialog()'放在回调中(第一个'if'条件)。你还需要绑定'this'。 – ftor

+0

可能的重复[如何从异步调用返回响应?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Andreas

+0

https://jsfiddle.net/rayon_1990/tzzze97s/ – Rayon

回答

0

当异步调用完成时,调用asyncThing的函数将被调用(如果可能的话)。所以这不会被逐行解释。

移动后者,如果问题回调函数,它会没事的。

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

@Hank什么是['this'](http://stackoverflow.com/a/20279485/6445533)绑定,当最后调用回调?这不起作用。 – ftor

+0

我认为这是更大的事情的一部分。如果(结果){ 这也是我会建议 。closeDialog(); } 它会有一个如果少一个变量少。但这不是问题 – Rouz

1

你应该看看使用的承诺。 JQuery Ajax调用本地返回一个Promise。

EG:

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

地方对话框关闭呼叫的成功或失败的一部分。

1

根据您的代码段应该看起来是这样:

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

    }); 
}, 

在你的版本代码

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

获取asyncThing调用回调函数之前调用。这就是为什么对话closeDialog被称为

+0

你是对的:-) 非常感谢您的快速回复! –

1

这是因为这段代码的异步部分在回调函数中。并且您在同步部分中调用关闭对话框,该请求在发送后立即运行。 只需将该呼叫移至回叫。

如上所述,您还需要在回调函数内处理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,。适用):

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

也有对处理异步许诺模式。但正确使用会更困难。