2015-12-06 2 views
5

Я немного смущен тем, как правильно использовать выборку. Кажется, что оно разрешимо даже когда я возвращаю статус ошибки. Правилен ли приведенный ниже код (обертывание выборки в другое обещание)?Отклонение обещания при использовании выборки

function a(url, config) { 
 
    if (!config) 
 
    config = {}; 
 

 
    config = Object.assign(config, { 
 
    headers: { 
 
     'content-type': 'application/json;charset=utf-8' 
 
    } 
 
    }) 
 
    return new Promise(
 
    function(resolve, reject) { 
 
     fetch(url, config).then(
 
     function(res) { 
 
      if (res.status == 200 && res.ok) { 
 
      console.log("Promise resolved") 
 
      resolve(res); 
 
      return; 
 
      } 
 
      console.log("Promise rejected") 
 
      reject(res); 
 
     }, 
 
     function(rej) { 
 
      console.log("promise rejected") 
 
      reject(rej); 
 
     } 
 
    ) 
 
    } 
 
) 
 
} 
 

 
function b() { 
 
    a('/test').then(
 
    function(res) { 
 
     console.log('success'); 
 
     console.log(res) 
 
    }, 
 
    function(rej) { 
 
     console.log('Rejected'); 
 
     console.log(rej) 
 
    } 
 
) 
 
} 
 

 
b();
(приведенный выше код должен работать нормально в хроме с помощью консоли ... просто копировать/вставить)

+1

если 'fetch' является выборка, которая существует во всех современных браузерах, это, как вы четко знаете, возвращается Обещание. Поэтому нет необходимости обертывать это обещанием, оно только путает вещи –

+0

Фактически ... он разрешает даже с статусом ошибки, например, 400. Следовательно, если я хочу, чтобы вызываемый узнал, что он получил код ошибки ... Мне нужно обернуть и отклонить, если это не нормально/200. Хотя ... в данный момент ... приведенный выше код работает так, как ожидалось (b запускает отказ) ... Я смотрю на свой код, чтобы попытаться переписать выше, чтобы соответствовать ему. В любом случае, приведенное выше было всего лишь примером, и выбор был именно тем, что я мог использовать, чтобы создать обещание, которое легко продемонстрировать. – Goblinlord

+1

Выглядит хорошо, с помощью этого кода вы получаете «Обещание отклонено», «Отклонено». Как и ожидалось. Неясно, в чем проблема. – dfsq

ответ

2

Если вы хотите отказаться от успеха обратного вызова вам нужно сделать, это явно либо возвращение отклоненное обещание, например return Promise.reject('error occurred'); или путем метания.

Кроме того, вы не должны злоупотреблять Promise конструктор в вашем случае, поскольку fetch уже возвращает объект обещание:

function a(url, config) { 
    if (!config) 
     config = {}; 

    config = Object.assign(config, { 
     headers: { 
      'content-type': 'application/json;charset=utf-8' 
     } 
    }); 

    return fetch(url, config).then(
     function(res) { 
      if (res.status == 200 && res.ok) { 
       console.log("Promise resolved") 
       return res.json(); 
      } 
      console.log("Promise rejected"); 
      throw 'promise rejected'; 
     }, 
     function(rej) { 
      console.log("promise rejected"); 
      throw 'promise rejected'; 
     } 
    ); 
} 
+0

Я не могу удалить вопрос, поскольку код действительно работает как ожидалось = /. Спасибо за предложения для бросков вместо того, что я делал. – Goblinlord

Смежные вопросы