Как распространить отказ в цепочке обещаний ES6?

Обычно два объекта Promise создаются при вызовах функций. Я собрал обещания вместе, показывая, чего я ожидаю:

new Promise((resolve, reject) => {

    //function call with returned promise...

    return new Promise((resolve, reject) => {

      reject("rejectCall_2")  //Prints nothing

    })

}).catch( e1 => {
  console.log('e1',e1) 
})

Это должно было распространить отказ на мое родительское обещание. Как я могу зафиксировать rejectCall_2 во внешнем обещании?


person jcalfee314    schedule 09.07.2015    source источник
comment
Зачем вам нужно вкладывать 2 промиса? Я не вижу ни одного варианта использования, который привел бы к такому коду.   -  person Florian Margaine    schedule 09.07.2015
comment
Побочный комментарий: отклоняйте ошибки, а не строки. то есть reject(new Error('rejectCall_2'));   -  person Florian Margaine    schedule 09.07.2015
comment
Почему вы заключаете вызов метода, возвращающего промис, в конструктор промисов? Если у вас есть foo.bar(), который возвращает обещание, вы можете просто foo.bar().catch(e => ...).   -  person ssube    schedule 09.07.2015
comment
У нас есть различные действия, которые возвращают обещание, которые часто обращаются к индексированному уровню базы данных db, который также возвращает обещания. Я не понимаю, как вы могли бы жестко кодировать обмен обещаниями, мы просто позволяем всему возвращать обещание, а затем связываем их вместе.   -  person jcalfee314    schedule 09.07.2015
comment
Это выглядит много как антишаблон построения промисов. Вы должны просто связать вещи вместе, не используя new Promise.   -  person Bergi    schedule 09.07.2015


Ответы (1)


Вы ничего не возвращаете изнутри new Promise. Все, что вы возвращаете, просто выбрасывается. Что вы делаете, так это решаете и отвергаете. Если вы хотите «вернуть» что-то, включая другое обещание, вам нужно разрешить это что-то.

Итак, что вы хотите, это

new Promise((resolve, reject) => {
    //function call with returned promise...
    resolve(new Promise((resolve, reject) => {
    ^^^^^^^
      reject("rejectCall_2")
    }));
}).catch(e1 => {
  console.log('e1', e1) 
})

Протестировано с помощью babel-node.

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

new Promise((resolve, reject) => 
    resolve(new Promise((resolve, reject) => 
      reject("rejectCall_2")
    ));
).catch( e1 => console.log('e1',e1));

Я хотел бы принять к сведению комментарии, в которых предполагается, что вы можете быть виновны в «анти-шаблоне явного конструктора обещаний», когда вы создаете обещание только для того, чтобы разрешить или отклонить его с помощью какого-то другого обещания, которое вы могли только что использовать в первую очередь. Я предполагаю, что ваш пример является искусственным, предназначенным для демонстрации вашей конкретной проблемы.

person Community    schedule 09.07.2015
comment
Спасибо, это работает! Я очень рад, что это была моя оплошность, а не поведение обещаний es6. - person jcalfee314; 09.07.2015