链jquery承诺,但分别处理故障

时间:2017-02-06 19:06:47

标签: jquery promise

方案如下:

  • 调用返回对象数组的服务器if 一切都好。
  • 如果服务器上发生错误,则返回a 包含错误消息的json。

在这个场景中,我想创建一个返回promise的函数,我可以从客户端使用这个函数:

initData()
    .done(function(myArray) {
        processData(myArray);
    })
    .fail(function(response) {
        console.log("An error occured: " + response.errorMessage);
    });

客户端不应该关心initData()是否调用服务器,它应该为ajax调用失败或服务器特定错误调用fail()。

为此我需要两件事:

  1. 隐藏服务器调用失败并创建新的错误消息对象。
  2. 如果对服务器的调用返回错误消息对象,则使promise失败。
  3. 以下是我所拥有的:

    function initData() {
        var promise = $.getJSON(url);
    
        return promise.then(function(response) {
            if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') {
                // Do something to trigger fail() in the client caller.
            }
            return response;
        }, function(resp) {
            // This satisfies point 1 above.
            return { errorMessage: "Server error." };
        });
    }
    

    我如何满足第二项要求?我使用的是jquery 3.1.1。

    感谢。

2 个答案:

答案 0 :(得分:1)

从您的then回调中抛出错误。来电者会#34;赶上"它在失败的回调中(虽然我建议您学习使用标准thencatch并停止使用特定于jquery的donefail)。

function initData() {
    var promise = $.getJSON(url);

    return promise.then(function(response) {
        if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') {
            throw new Error("uh oh!");
        }
        return response;
    }, function(resp) {
        // This satisfies point 1 above.
        throw new Error("server error");
    });
}

答案 1 :(得分:1)

要使承诺失败,只需throw结果而不是return

function initData() {
    return $.getJSON(url)e.then(function(response) {
        if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') {
            throw { errorMessage: "Response error." };
        }
        return response;
    }, function(resp) {
        throw { errorMessage: "Server error." };
    });
}

(这仅适用于jQuery 3.对于早期版本,请参阅Throwing an Error in jQuery's Deferred object