承诺 - 链接解决/拒绝

时间:2015-11-12 14:14:16

标签: javascript jquery jquery-deferred

我有一个函数可以返回deferred.promise - jQuery的deferred s变体 - 但是相同的概念。

文件读取是否成功,我想进入链的下一部分。如下所示:

var a,
    b,
    c;

readFile(fileNameA)
    .then(
        function (res) {
            a = res; // res might be null

            return readFile(fileNameB);
        },
        function (err) {
            return readFile(fileNameB);
        }
    )
    .then(
        function (res) {
            b = res; // res might be null

            return readFile(fileNameC);
        },
        function (err) {
            return readFile(fileNameC);
        }
    )
    .then(
        function (res) {
            c = res; // res might be null

            callPostLogic();
        },
        function (err) {
            callPostLogic();
        }
    );

然而,对我来说,这似乎是不必要的代码重复。因为如果其中一个读取失败,我不想破坏链 - 所以在本地处理每个错误。

有没有办法解决这个问题,以使其更清洁并避免代码重复?我并不太关心每个readFile电话的粒度。

我不喜欢在解析/拒绝的回调中重复代码调用。

1 个答案:

答案 0 :(得分:3)

因为您使用的是jQuery Promises,所以您可以使用函数deferred.always。如果成功或失败,它会被调用。它就像finally - Block

中的try-catch

您可以轻松使用它:

$.get( "test.php" ).always(function() {
  alert( "$.get completed with success or error callback arguments" );
});

因此,在您的情况下,您可以执行类似

的操作
readFile(fileNameA)
    .always(function() {
        return readFile(fileNameB);
    })
    .always(function() {
        return readFile(fileNamec);
    })
    .always(function() {
       // finished
    });

您可在此处找到文档:https://api.jquery.com/deferred.always/