javascript - 如何在错误时打破 promise 链

标签 javascript node.js promise

考虑这个片段

fetch(`http://${api.host}:${api.port}/user`)
  .then(function(data) {
    return data.json();
  }, function(err) {
    throw new Error(`Couldn\'t fetch user data from server: ${err.message}`);
  }).then(function(eparkUser) {
    for (var key in eparkUser) {
      if (eparkUser.hasOwnProperty(key) && !user.hasOwnProperty(key)) {
        user[key] = eparkUser[key];
      }
    }
    done(null, user);
  }, function(err) {
    throw new Error(`Couldn't parse returned json: ${err.message}`);
  }).catch(function(e) {
    done(e);
  });

throw 不是应该打破链条并触发 .catch 吗?如何实现这种行为?因为现在两个 throw 都被执行了,我看到了消息:

错误:无法解析返回的 json:无法从服务器获取用户数据:请求 http://localhost:3010/user 失败 这不是我想要的。

附注fetch 是 npm node-fetch 模块

最佳答案

不,throw 不会跳转到catch。它确实拒绝了 promise ,并且安装在其上的所有错误处理程序都将被调用。在您的例子中,这是由 then 调用安装的错误处理程序。请注意,.catch(handler) 只是 .then(null, handler) 的糖衣。

您当前的代码工作方式类似于

try {
    try {
        try {
            var data = fetch(`http://${api.host}:${api.port}/user`)
        } catch(err) {
            throw new Error(`Couldn\'t fetch user data from server: ${err.message}`);
        }
        var eparkUser = data.json();
    } catch(err) {
        throw new Error(`Couldn't parse returned json: ${err.message}`);
    }
    for (var key in eparkUser) {
        if (eparkUser.hasOwnProperty(key) && !user.hasOwnProperty(key)) {
            user[key] = eparkUser[key];
        }
    }
    done(null, user);
} catch(e) {
    done(e);
}

要解决您的问题,您需要嵌套处理程序,并仅在特定的 Promise 上安装 JSON-parse-handler:

fetch(`http://${api.host}:${api.port}/user`)
    .then(function (data) {
        return data.json()
            .then(function (eparkUser) {
                for (var key in eparkUser) {
                    if (eparkUser.hasOwnProperty(key) && !user.hasOwnProperty(key)) {
                        user[key] = eparkUser[key];
                    }
                }
                return user;
            }, function(err) {
                throw new Error(`Couldn't parse returned json: ${err.message}`);
            });
    }, function(err) {
        throw new Error(`Couldn\'t fetch user data from server: ${err.message}`);
    })
    .then(done.bind(null, null), done);

关于javascript - 如何在错误时打破 promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34748350/

相关文章:

javascript - Node.js 测试后清理数据库

javascript - Response.Redirect(Request.RawUrl) 之后的 Response.Write

javascript - 使用 Node.js 网络服务器的 Angular.js 教程

JavaScript Promises 混淆反模式?

javascript - Underscore.js 模板会破坏 notepad++ 中的语法突出显示吗?

javascript - js/jQuery Drag'n'Drop,重新计算放置目标

node.js - 从消息中获取图像 URL

node.js - 定期递归调用函数

javascript - Loopback API 和 Promise

javascript - 如何对依赖于 Promise 的 AngularJS Controller 进行单元测试?