2015-11-20 2 views
2

Я использую объект prom в node.js. У меня есть объект:Путаница по цепочке ошибок объекта обещания

var Send = { 
    send(post_ids) { 
     return Post.findById(post_ids) 
      .then((posts) => { 
       return sendArticlesToWechat(setupArticles(posts)); // sendArticlesToWechat is also a promise 
      }) 
      .then((result) => { 
       console.log("RESULT: " + result); 
      }) 
      .catch((err) => { 
       console.error("SEND ERROR: " + err); 
       return err; 
      }); 
     }, 
} 

export default Send; 

и вызвать метод в другом файле:

Send.send(req.body) 
    .then((result) => { 
     console.log("CALL SEND: " + result); 
    }) 
    .catch((err) => { 
     console.error(err); 
    }); 

При возникновении ошибки, я получил два вывода:

SEND ERROR: ERROR: // error message 
CALL SEND: ERROR: // error message 

Эта ошибка произошла в sendArticlesToWechat() функция, которая будет возвращена. Потому что это обещание тоже, поэтому я могу catch его ошибка снаружи. Это то, чего я ожидал.

Когда я вызываю Send.send(), я ожидал получить ошибку в catch(), но ошибка появляется в методе then().

В соответствии с выходом, ошибка вернулась с предыдущего catch(), почему я не могу сохранить ее в catch()?

ответ

1

Проблема в вашем окончательном catch(). Потому что вы return err, вы вызываете обещание стать разрешенным, а не отклоненным. Если вы хотите вернуть отклоненный обещание, то либо удалить catch() или повторно бросить err

var Send = { 
    send(post_ids) { 
     return Post.findById(post_ids) 
      .then((posts) => { 
       return sendArticlesToWechat(setupArticles(posts)); // sendArticlesToWechat is also a promise 
      }) 
      .then((result) => { 
       console.log("RESULT: " + result); 
      }) 
      .catch((err) => { 
       console.error("SEND ERROR: " + err); 
       //return err;//converts from reject to resolved 
       throw err; 
      }); 
     }, 
} 

export default Send; 
+0

да, это работает. Благодарю. Так какой, по вашему мнению, лучше? удалить 'catch()' или 'throw err'? –

+0

Это может отличаться, но в этом случае я бы пошел с 'throw err'. Я бы выполнил вход в ваш объект 'Send' на всякий случай, если вызывающий код забыл написать' catch() '. Таким образом, по крайней мере в журналах появится ошибка. – pgreen2

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