Использование javascript-выборки и вызов службы отдыха, которая в случае успеха возвращает большой двоичный объект, в противном случае возвращает сообщение об ошибке как json. Как это будет обрабатываться в выборке? Фактическая служба - это реализация веб-API asp.net, которая в случае успеха возвращает FileStreamResult (или FileContentResult), в противном случае возвращает код ошибки с json, содержащим сообщение об ошибке. Ниже приведен пример того, что я пытаюсь сделать:
fetch('flowers.jpg').then(function(response) {
if (response.ok) {
return response.blob();
} else {
return response.json();
}
}).then(function(myBlob) { // here I would also like to function(jsonError)
var objectURL = URL.createObjectURL(myBlob);
myImage.src = objectURL;
}).catch(function(error) {
console.info('There has been a problem with your fetch operation: ', error.message);
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку вы хотите пойти двумя довольно разными путями, это одна из относительно редких ситуаций, когда вы, вероятно, захотите вложить обработчики:
fetch('flowers.jpg').then(function(response) {
if (response.ok) {
return response.blob().then(function(myBlob) {
var objectURL = URL.createObjectURL(myBlob);
myImage.src = objectURL;
});
} else {
return response.json().then(function(jsonError) {
// ...
});
}
}).catch(function(error) {
console.info('There has been a problem with your fetch operation: ', error.message);
});
Вы можете использовать вложенный блок then, чтобы передать буквально все, что вы хотите, следующему обработчику then. Образец:
fetch('flowers.jpg').then(function (response) {
if (response.ok) {
return response.blob()
.then(function (myBlob) {
return {
blob: myBlob
};
});
} else {
return response.json()
.then(function (myJson) {
return {
json: myJson
};
});
}
}).then(function (myData) {
if (myData.blob){
// Handle blob case
}else{
// Handle JSON case
}
}).catch(function (error) {
console.info('There has been a problem with your fetch operation: ', error.message);
});
Возможно, более семантически точный способ обработки этого - отклонение при возникновении ошибки.
fetch('flowers.jpg').then(function (response) {
if (response.ok) {
return response.blob();
} else {
return response.json()
.then(function (myJson) {
return Promise.reject(myJson);
});
}
}).then(function (myData) {
// Handle blob case
}).catch(function (error) {
//Handle JSON case
});
О да. У меня плохая привычка для «читабельности». Нужно прекратить это делать :)
Нет смысла использовать
return Promise.resolve(value);из обработчикаthen, просто используйтеreturn value;.thenвсегда возвращает обещание, которое разрешается с помощью возвращаемого вами значения (или отклоняется с тем, что вы выбрасываете), если вы не возвращаете обещание. (Если вы это сделаете, обещаниеthenсоздает и возвращает ему цепочки.) Таким образом, он просто создает дополнительный уровень. :-)