使用承诺的正确心态?

时间:2017-09-23 10:07:19

标签: javascript promise

我最近才看到承诺(JS不是我的强项)而且我不确定这样做的正确方法是什么。承诺应该是防止右漂移的代码,但是当我最终得到一些复杂的逻辑时,我最终还是嵌套得太深了,所以我确信我做错了。

如果我将成功和失败都作为json值返回,并且我也想处理格式错误的json,我立即想做这样的事情:

fetch('json').then(function (result) {
    return result.json();
}).catch(function (result) {
    console.error("Json parse failed!");
    console.error(result.text);
}).then(function (wat) {
    // if (!result.ok) { throw...
}).catch(function (wat) {
    // Catch http error codes and log the json.errormessage
});

当然,这不会奏效。这是陈规定型的同步代码。但这是我想到的第一件事。我能看到的问题:

  • 如何同时获得响应和json输出?
  • 如何获得错误和成功的单独控制流程?
  • 如何在两种类型的响应中捕获json解析错误?

我最好的尝试包括筑巢到我可能使用回调的地步,它最终没有起作用,因为我还没有解决上述任何问题:

fetch('json').then(function (response) {
    if (!response.ok) {
        throw response;
    }
}).then(
    function (response) {
        response.json().then(function (data) {
            console.log(data);
        });
    },
    function (response) {
        response.json().then(function (data) {
            console.error(data.errormessage);
        });
    }
).catch(function () {
    console.error("Json parse failed!");
    // Where's my response????
});

"对"是什么?这样做的方法? (或至少错误更少)

2 个答案:

答案 0 :(得分:2)

如果您想要呼叫response.json()(对于成功和失败的响应)并且想要一起使用response响应数据。使用Promise.all

fetch('json')
  .then(response => Promise.all([response, response.json()]))
  .then(([response, data]) => {
    if (!response.ok) {
      console.error(data.errormessage);
    } else {
      console.log(data);
    }
  })
  .catch(err => {
    if (/* if http error */) {
      console.error('Http error');
    } else if (/* if json parse error */) 
      console.error('Json parse failed');
    } else {
      console.error('Unknown error: ' + err);
    }
  });

答案 1 :(得分:1)

你不应该在Promise中使用异常来控制流程,不应该在不使用Promise时使用。这就是为什么fetch本身不会拒绝200以外的状态代码的承诺。

这是一个建议,但答案必然取决于您的具体需求。

fetch('json').then(function (response) {
    if (!response.ok) {
        response.json().then(function (data) {
            console.error(data.errorMessage);
        });
        return ...;
    }

    return response.json().catch(function () {
        console.error("Json parse failed!");
        return ...;
    });
}).catch(function (e) {
    console.error(e);
    return ...;
});