链接包含嵌套AJAX调用的JavaScript Promises

时间:2014-12-04 19:17:56

标签: javascript promise es6-promise

我希望用JavaScript Promises替换我现有的一些代码,我只想确认我做错了(或者有更好的方法)。我正在使用es6-promise库。

我所拥有的是我使用JavaScript Promises更新的三个函数(以前是嵌套的,回调函数混乱)。这些函数实际上应该具有双模式,即我可以像常规函数一样使用它们并让它们返回结果,或者我可以将它们链接在一起。

function func_1()
{
    return new Promise(function(resolve, reject){
        if(condition)
        {
            resolve('1');
        }
        else
        {
            console.log('start');
            resolve(ajaxRequest(url));
        }
    });
}

function func_2(data)
{
    return new Promise(function(resolve, reject){
        if(condition)
        {
            resolve('2');
        }
        else
        {
            console.log(data.response);
            resolve(ajaxRequest(url));
        }
    });
}

function func_3(data)
{
    return new Promise(function(resolve, reject){
        if(condition)
        {
            resolve('3');
        }
        else
        {
            console.log(data.response);
            resolve(ajaxRequest(url));
        }
    });
}

func_1().then(func_2).then(func_3).then(function(data){});

if用于检查数据是否缓存在localStorage / sessionStorage中,如果是,则该函数只返回结果。但是,在我不确定值是否已被缓存的情况下(例如,首次运行脚本),我计划将它们链接起来,然后让每个后续函数将其前一个函数的结果保存到localStorage / sessionStorage(因此{ {1}}最后一行的链接)。最终的promise让我有机会保留then的数据。

根据我运行的测试,一切似乎都运行正常,但我只是想知道这是否是最好的方法呢?我如何处理可能在3个列出的函数中的一个或多个上发生的AJAX错误?

注意:我的func_3功能也使用了相同的Promise机制,并且'解析'完整的XHR成功,并拒绝'失败/错误时完全相同的XHR。

修改

来自@Bergi的提示后,我已经将代码更新为这样(并且它的工作原理也一样):

AjaxRequest

1 个答案:

答案 0 :(得分:3)

  一切似乎都运转正常,但我只是想知道这是否是最佳方式?

你应该永远不需要使用Promise构造函数,除非在最低级别(即在宣传ajax请求时)。你的函数应该简单地写成:

function func_1() {
    if (condition) {
        return Promise.resolve('1');
    } else {
        console.log('start');
        retrun ajaxRequest(url);
    }
}

严格来说,func_2func_3甚至可以return '2'then方法可以将它们用作回调。当然,总是返回一个promise对象会更清晰。

  

如何处理可能在3个列出的函数中的一个或多个上发生的AJAX错误?

将第二个功能传递给then,或使用catch。当promise被拒绝时,将调用此回调,并应处理异常。