Является ли использование async / await единственным способом получить разрешенное обещание от Promise.reject ()? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть следующий код ниже.То, что я хочу сделать, это обрабатывать случай сетевых ошибок и возвращенные случаи ошибок 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);
      })

Но финал с console.log вызывается всегда, даже когда я вызываю Promise.resolve() в приведенном выше коде, как это было прикреплено к самому обещанию из функции fetch.Вы знаете, почему это происходит.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

А как насчет этой версии:

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)
0 голосов
/ 14 декабря 2018

Вы можете дождаться обещания, а затем отклонить его:

return response.text().then(text => Promise.reject(text));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...