我在javascript函数中有几个语句。
postTransaction
函数正在进行异步调用,该调用正在调用Web服务并返回成功或失败。我有两个成功的回调方法(transactionSuccess)和失败(transactionFailure)。
这里我的问题是如果服务失败我应该停止执行下一个语句,即return requestDetails();
我不想在这里使用setTimeOut函数。还有其他方法来处理我的情况吗?
function doSomeThing () {
postTransaction(objSelectedAccount,transactionSuccess,transactionFailure);
return requestDetails();
}
function requestDetails () {
return true;
}
function postTransaction () {
$.ajax('URL', {
method: "POST",
dataType: "json",
data: {},
success: function (payload) {
callBackSucces(payload);
},
error: function(xhr, statusText, ex) {
callBackFailure(xhr);
}
});
}
答案 0 :(得分:1)
您无法根据异步操作的结果停止执行下一个语句。这就是异步操作的重点!您也不希望将ajax请求设置为阻止请求,因为这将冻结UI直到请求完成 - 糟糕的用户体验可能还会导致“脚本已停止响应”来自浏览器的警报。
您可以做的最好的事情是将您想要延迟的任何处理移动到ajax调用的成功处理程序中。不要将ajax调用视为“返回成功或失败”的东西;它实际上并没有返回任何东西(在JavaScript意义上)。相反,将其视为在未来某个时间产生成功或失败事件的事物,并编写应用程序以处理事件。
答案 1 :(得分:0)
如果在调用requestDetails()
之前无法调用transactionSuccess
,那么您可以将requestDetails
放入transactionSuccess
。你的函数doSomehting
不应该是一个同步函数。
因此,将代码更改为以下内容:
function doSomething(callback) {
postTransaction(objSelectedAccount, function () {
// success and do something..
callback requestDetails();
}, transactionFailure);
}
具有异步步骤的函数也应该是异步函数。
我希望这可以帮助你,请原谅我可怜的英语..
答案 2 :(得分:0)
function doSomeThing () {
postTransaction(objSelectedAccount,transactionSuccess,transactionFailure);
}
function requestDetails () {
return true;
}
function postTransaction () {
$.ajax('URL', {
method: "POST",
dataType: "json",
data: {},
success: function (payload) {
requestDetails(payload);
},
error: function(xhr, statusText, ex) {
callBackFailure(xhr);
}
});
}
OR,
使用同步请求。
答案 3 :(得分:0)
无法将异步操作更改为同步操作(即“等待”结果然后调用或不调用其他操作)。
您必须返工并将逻辑分解为更小的部分,以便在“成功”回调中完成(或刚刚开始)操作。
请注意,许多异步操作实际上只是对服务器的请求,并且可以发出同步请求(即,在躲避答案而不是使用回调时执行“获取”阻止),但这被认为不是一个好主意。一般情况是因为应用程序响应性降低。
不幸的是(并且由于我不完全理解的原因)Javascript不公开事件调度原语,因此当异步非常不方便时(例如请求),不可能使用通常在GUI等其他事件驱动环境中完成的操作确认)这是一个“嵌套事件循环”。
无法从异步操作构建同步操作的事实也是node
中许多函数存在等效Synch
版本的原因,应用程序员无法使用这些版本创建