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

时间:2013-12-31 01:03:14

标签: javascript jquery

我在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);
        }
    });
}

4 个答案:

答案 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版本的原因,应用程序员无法使用这些版本创建