Javascript 如果异步函数返回任何错误,如何停止执行next语句?
下面是javascript函数中的两条语句Javascript 如果异步函数返回任何错误,如何停止执行next语句?,javascript,jquery,Javascript,Jquery,下面是javascript函数中的两条语句 postTransaction函数正在进行异步调用,该调用调用Web服务并返回成功或失败。对于成功(transactionSuccess)和失败(transactionFailure),我有两种回调方法 这里我的问题是,如果服务失败,我应该停止执行下一条语句,即returnrequestdetails()我不想在这里使用setTimeOut函数。还有别的办法处理我的情况吗 function doSomeThing () { postTrans
postTransaction
函数正在进行异步调用,该调用调用Web服务并返回成功或失败。对于成功(transactionSuccess)和失败(transactionFailure),我有两种回调方法
这里我的问题是,如果服务失败,我应该停止执行下一条语句,即returnrequestdetails()代码>我不想在这里使用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);
}
});
}
不能基于异步操作的结果停止执行下一条语句。这就是异步操作的全部要点!您也不希望将ajax请求设置为阻塞请求,因为这将冻结UI,直到请求完成——这是一种糟糕的用户体验,可能还会导致浏览器发出“脚本已停止响应”警报
您所能做的最好的事情就是将您希望延迟的任何处理移动到ajax调用的成功处理程序中。不要把ajax调用看作是“返回成功或失败”的东西;它实际上不返回任何内容(在JavaScript意义上)。相反,可以将其视为在将来某个时间生成成功或失败事件的东西,并对应用程序进行编码以处理事件。如果requestDetails()
在调用transactionSuccess
之前可能不会调用,然后您可以将requestDetails
放入transactionSuccess
中。您的函数doSomehting
不应该是同步函数
因此,请将代码更改为以下内容:
function doSomething(callback) {
postTransaction(objSelectedAccount, function () {
// success and do something..
callback requestDetails();
}, transactionFailure);
}
具有异步步骤的函数也应该是异步函数
我希望这能对你有所帮助,请原谅我糟糕的英语
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);
}
});
}
或者
使用同步请求无法将异步操作更改为同步操作(即“等待”结果,然后调用或不调用其他操作)
您必须返工并将逻辑分解为更小的部分,以便在“成功”回调中完成(或刚刚开始)操作
请注意,许多异步操作实际上只是对服务器的请求,可以发出同步请求(即执行“get”阻塞,同时不使用回调来等待答案),但这通常被认为不是一个好主意,因为应用程序的响应性变差
不幸的是(出于我不完全理解的原因),Javascript没有公开事件调度原语,因此无法使用在其他事件驱动环境(如GUI)中通常执行的操作,因为异步非常不方便(例如请求确认),这是一个“嵌套事件循环”
您无法从异步操作构建同步操作,这也是为什么在节点
中,对于许多函数,存在应用程序程序员无法创建的等效同步
版本的原因。在您的代码中,您在哪里调用requestDetails()函数?您可以发布完整的代码吗?虽然在这种情况下,同步Ajax请求可能会“起作用”,但如果没有更多的上下文,就很难提出更合适的方法。在任何情况下,您最好重构代码,这样您就不会“等待”结果,而是让您的success
处理程序在收到响应后处理结果。