javascript - 使用 async/await 是从 Promise.reject() 接收已解决承诺的唯一方法吗?
问题描述
我在下面有以下代码。我要做的是分别处理网络错误情况和返回的HTTP服务器错误情况。
fetch("$imageUploadUrl", {
method: "POST",
mode: "same-origin",
cache: "no-store",
credentials: "same-origin",
redirect: "error",
referrer: "origin",
body: formData
}).catch(function(error) {
failure("There was an error while uploading the image");
}).then(function(response) {
if (response.ok){
return Promise.resolve(response.json());
} else {
return Promise.reject(response.text())
}
}).then(function(result) {
success(result.location);
}).catch(function(errorText) {
return failure (errorText);
})
然而,与Promise.resolve()
,不同的是,在返回它之前Promise.reject()
不会等待解决承诺。response.text()
通过像这样添加 async/await,我设法收到了一个已解决的承诺:
fetch("$imageUploadUrl", {
method: "POST",
mode: "same-origin",
cache: "no-store",
credentials: "same-origin",
redirect: "error",
referrer: "origin",
body: formData
}).catch(function(error) {
failure("There was an error while uploading the image");
}).then(async function(response) {
if (response.ok){
return Promise.resolve(response.json());
} else {
return Promise.reject(await response.text())
}
}).then(function(result) {
success(result.location);
}).catch(function(errorText) {
failure(errorText);
});
这是达到我目标的唯一方法吗?
我也试过这样做:
fetch("$imageUploadUrl", {
method: "POST",
mode: "same-origin",
cache: "no-store",
credentials: "same-origin",
redirect: "error",
referrer: "origin",
body: formData
}).catch(function(error) {
failure("There was an error while uploading the image");
}).then(function(response) {
if (response.ok){
return Promise.resolve(response.json());
} else {
return Promise.reject(response.text())
}
}).then(function(result) {
success(result.location);
}).catch(function(textPromise) {
return textPromise;
}).then(function(text) {
console.log(text);
})
但是最后一个 thenconsole.log
总是被调用,即使我调用Promise.resolve()
它上面的代码,因为它附加在 fetch 函数本身的 promise 上。你知道为什么会这样吗?
解决方案
您可以等待承诺,然后拒绝它:
return response.text().then(text => Promise.reject(text));
推荐阅读
- c# - 实体框架的外键和列问题
- plugins - 我在下载的bz2中找不到exe文件
- amazon-web-services - AWS S3 对象的 ETag 可用性保证
- amazon-web-services - 我是否需要验证 Amazon SES 中的电子邮件地址或域?
- angular - TypeScript中带箭头<type>的赋值是什么意思?
- javascript - 用 reactjs 显示不同的strapi项目id
- javascript - 如何使此功能按顺序运行?我可能误解了异步,等待
- mysql-8.0 - 使用 mydumper 时出错,因为移动到 mysql8 是由用于新行的字符 `\x0A` 引起的
- optimization - 在 lpsolve 中声明二进制变量的正确方法是什么?
- ios - CLLocationManager 的 AuthorizationStatus 在 iOS 14 上已弃用