等待异步电话结束-太迟了
Wait for asyn call to finish - too late
我有一个带有按钮的对话框。单击按钮后,调用一个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。但是很难正确使用。
相关文章:
- 为什么“;未定义的“;在JavaScript中结束循环
- 我的职位回报太快了,如何做出承诺
- 循环结束/推送到数组之前在页面上呈现EJS
- CSS-若窗口太小,滚动条会出现在“表格”单元格上
- Wacom stu-430签名捕获速度太慢
- 在另一个函数成功结束后调用该函数
- 在动画结束之前调用函数
- 如果使用javascript函数屏幕太小,我该如何更改HTML文件的背景色
- 一个html元素的克隆次数太多
- 希望日期开始结束于while循环中的一个房间id的一个数组
- 使用nunjucks时发生块结束错误
- 加载侦听器上的函数触发得太早
- 使用PHP和ajax传递URL不太正常的变量
- HTML5获取弧的坐标's结束
- 内容结束时停止无限滚动
- 咽表结束得太早了
- 角度,数组复制太迟
- 粘性导航太迟了
- 过渡结束事件触发得太快了
- 等待异步电话结束-太迟了