Javascript выборка обрабатывать как JSON и BLOB-объектов - PullRequest
0 голосов
/ 04 мая 2018

Использование javascript fetch и вызов службы отдыха, которая в случае успеха возвращает большой двоичный объект, в противном случае возвращает сообщение об ошибке как 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.log('There has been a problem with your fetch operation: ', error.message);
});

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете использовать nested, затем block, чтобы передать буквально все, что вы хотите, своему следующему, затем обработчику. Пример:

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.log('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
});
0 голосов
/ 04 мая 2018

Поскольку вы хотите пойти по двум довольно разным путям, это одна из относительно редких ситуаций, когда вы, вероятно, захотите вложить обработчики:

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.log('There has been a problem with your fetch operation: ', error.message);
});
...