javascript - DRY Then and Always in jQuery Promise

标签 javascript jquery promise

我有以下示例 JS 代码:

function loadData(url, data) {
    return $.get(url, data ? data : {});
}

function example1() {

    showSpinner();

    $.when(loadData('/example1', { hello: 'world' }))
        .then(function (resp) {
            // do something with the data
        })
        .always(function(){
            hideSpinner();
        })
        .fail(function (jqXHR, textStatus, errorThrown) {
            handleError(jqXHR);
        });
}

function example2() {

    showSpinner();

    $.when(loadData('/example2', { hello: 'world' }))
        .then(function (resp) {
            // do something with the data
        })
        .then(function () {
            // do something else
        })
        .always(function(){
            hideSpinner();
        })
        .fail(function (jqXHR, textStatus, errorThrown) {
            handleError(jqXHR);
        });
}

example1()example2() 使用相同的 promise 逻辑并将对返回的数据做一些不同的事情,然后总是隐藏微调器并处理失败相同(如果有的话)。问题是,在每个示例中加载数据后,我可能想做不同的事情,并且后面有多个 then's

但是我不得不重复alwaysfail 代码。我怎样才能让它们更干所以它们只写一次但在两种情况下都使用(如果需要的话还有其他例子)。 所以我不能只是将 when 移动到一个方法中并传递一个回调,因为可能有多个回调并且在不同的 then 中。 所以这是行不通的:

function customPromise(load, callback) {

    showSpinner();

    $.when(load)
    .then(function (resp) {
        callback(resp);
    })
    .always(function(){
        hideSpinner();
    })
    .fail(function (jqXHR, textStatus, errorThrown) {
        handleError(jqXHR);
    });

}

function example3() {
    customPromise(loadData('/example2', { hello: 'world' }));
}

最佳答案

如果你有连续且未知数量的回调,我建议你将整个处理移动到创建的函数:

function handleRequest(url, data, errorCallback) {
    // create promise
    let promise = $.get(url, data ? data : {});

    // if callback functions provided as args, chain them in `then()` calls
    if (arguments.length > 3) {
        let callbacks = Array.slice.call(arguments, 3);
        let fn = (results) => (results);
        let callback;
        for (let i = 0; i < callbacks.length; i++) {
            callback = callbacks[i] instanceof Function ? callbacks[i] : fn;
            promise.then(callback);
        }
    }

    // handle static behavior
    promise.always(() => {
        hideSpinner();
    })
    .fail(errorCallback);

    // return the created promise
    return promise;
}

您现在可以按如下方式使用此功能:

handleRequest(
    '/example',
    {},
    (jqXHR, textStatus, errorThrown) => {
        handleError(jqXHR);
    },
    (resp) => {
        // do something with the data
    },
    () => {
        // do something else
    }
);

关于javascript - DRY Then and Always in jQuery Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47283810/

相关文章:

javascript - jquery函数放在哪里

javascript - 通过带有angularjs和ionic的html img标签显示图像

javascript - $(this.element) 未定义,不明白为什么

javascript - 循环中的Promise,循环后的代码不执行

javascript - .catch 函数未捕获拒绝的值

javascript - 由于 background-url 样式,Internet Explorer 的安全消息

javascript - 如何遍历从 getElementsByTagName 返回的所有元素

javascript - 将函数参数设置为同一函数内的变量

javascript - 比较设置 div 的 bgcolor 的值

Javascript:使用 setTimeout 重试的函数