1

我希望用 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 (因此promise链在最后一行)。决赛then让我有机会从func_3.

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

注意:我的AjaxRequest函数也使用相同的 Promise 机制,并在成功时“解决”完整的 XHR,并在失败/错误时“拒绝”相同的完整 XHR。

编辑

在@Bergi 的提示之后,我将代码更新为如下所示(它也同样有效):

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

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

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

func_1().then(func_2).then(func_3).then(function(data){})['catch'](function(err){console.log(err)});
4

1 回答 1

3

一切似乎都正常,但我只是想知道这是否是最好的方法?

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

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

严格来说,它们func_2甚至func_3可能会做return '2'then它们被用作回调的方法可以应对这种情况。当然,总是返回一个 promise 对象会更干净。

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

将第二个函数传递给then,或使用catch。这个回调将在 promise 被拒绝时被调用,并且应该处理异常。

于 2014-12-04T19:28:46.660 回答