оператор возврата в .затем() часть обещания возвращает нежелательное значение

#node.js #mongodb #es6-promise

#node.js #mongodb #es6-обещание

Вопрос:

 module.exports.getTopMeal = function () {  mealKitModel.find({ "top_meal": true })  .then((kits) =gt; {  return kits;  })  .catch((err) =gt; {  console.log("Error finding top mealkit");  }) }  

Здесь я пытаюсь найти объекты, у которых есть атрибут top_meal true из MongoDB. Когда я помещаю инструкцию «console.log(комплекты)» в часть.then(комплекты), это дает мне желаемый результат. Но когда я импортирую эту функцию в другой файл javascript, возвращаемое значение этой функции показывает неопределенное. Я возвращаю наборы в части .then (), чтобы первое выполнение обещания find завершилось, а затем оно возвращает переменную kits.

Пожалуйста, кто-нибудь, покажите мне, где я ошибаюсь?

Ответ №1:

Вам нужно вернуть обещание.

 module.exports.getTopMeal = function () {  return mealKitModel.find({ "top_meal": true })  .then((kits) =gt; {  return kits;  })  .catch((err) =gt; {  console.log("Error finding top mealkit");  }) }  

Теперь вы можете сделать

 getTopMeal().then(topMeal =gt; {  console.log(topMeal) })  

В дополнение. Поскольку метод find возвращает наборы, вам не нужно явно возвращать его, поэтому функция становится:

 module.exports.getTopMeal = function () {  return mealKitModel.find({ "top_meal": true }) }  

Обратите внимание, что я также удалил функцию catch из mealKitModel.найдите, так как обычно вы не хотите перехватывать каждую функцию и выходить из нее, а вместо этого в конце есть один обработчик ошибок. Лучше всего просто вернуть обещание и разобраться с ним позже.

В принципе: Если вы поймаете в mealkitмодель.обнаружите, что вы не можете поймать ошибку из getTopMeal.

Но теперь, с рефакторингом, где вы просто возвращаете обещание, которое теперь можете выполнить:

 getTopMeal().then(topMeal =gt; {  console.log(topMeal) }) .catch(e =gt; {  console.log('now we can catch the error')  console.log(e)  })  

Комментарии:

1. Здесь нужно исправить еще две вещи. Это .then(kits =gt; return kits) совершенно не нужно, так как это уже разрешенное значение обещания. И, .catch() это «съедает» ошибку и не позволяет ей распространяться обратно вызывающему абоненту. Если вы собираетесь регистрировать ошибку внутренне, вам придется пересмотреть ее, чтобы вызывающий абонент увидел отклонение.

2. Да, я это добавил. Просто не сохранил изменения до вашего комментария 🙂

3. Я не знаю, сделали ли вы это специально или нет, но вы отредактировали правку, которую я внес в ваш вопрос, чтобы добавить .catch() в ваш пример кода (2-й блок кода в вашем вопросе). Мы всегда должны рекомендовать ответы, которые вызывают отказы в обещаниях. Ваш ответ в настоящее время этого не показывает.

4. Специально да, так как getTopMeal, как он это реализовал, не может поймать никаких ошибок, его код поглощает ошибку с помощью catch и console.log — так что добавленный .catch, который вы добавили, ничего не поймает. Ответ, который он искал, заключался в добавлении возврата. Я объяснил это, а затем продолжил разговор о том, как он не должен поглощать ошибку, а вместо этого использовать обработчик ошибок.

5. В будущем, когда вы отмените чьи-либо изменения, было бы уместно поместить комментарий под ответом и объяснить, что/почему вы изменили вместо этого. Ваша текущая версия теперь в порядке.