考虑这个片段
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/