我有下面的代码。我想做的是分别处理网络错误案例和返回的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()的promise后才返回它。通过像这样添加异步/等待,我成功地收到了一个已解析的承诺:
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);
})但最终的console.log总是被调用,即使当我在上面的代码中调用Promise.resolve()时也是如此,因为它附加在从fetch函数本身的promise上。你知道为什么会这样吗。
发布于 2018-12-14 23:27:59
你可以等待承诺,然后拒绝它:
return response.text().then(text => Promise.reject(text));发布于 2018-12-14 23:50:42
那么这个版本呢:
const options = {
method: 'POST',
mode: 'same-origin',
cache: 'no-store',
credentials: 'same-origin',
referrer: 'origin',
body: formData
}
async function parseResponse (response) {
try {
success(await response.json())
} catch () {
failure(await response.text())
}
}
function parseError (err) {
failure(`Error uploading file: ${err}`)
}
fetch('$imageUploadUrl', options)
.then(parseResponse)
.catch(parseError)https://stackoverflow.com/questions/53782566
复制相似问题