Javascript 如果异步函数返回任何错误,如何停止执行next语句?

Javascript 如果异步函数返回任何错误,如何停止执行next语句?,javascript,jquery,Javascript,Jquery,下面是javascript函数中的两条语句 postTransaction函数正在进行异步调用,该调用调用Web服务并返回成功或失败。对于成功(transactionSuccess)和失败(transactionFailure),我有两种回调方法 这里我的问题是,如果服务失败,我应该停止执行下一条语句,即returnrequestdetails()我不想在这里使用setTimeOut函数。还有别的办法处理我的情况吗 function doSomeThing () { postTrans

下面是javascript函数中的两条语句

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
处理程序在收到响应后处理结果。