gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:40:56 24 4
gpt4 key购买 nike

考虑这个片段

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com