Что такое необработанное promise?

Для изучения Angular 2 я пробую их учебник.

Я получаю сообщение об ошибке:

(node:4796) UnhandledPromiseRejectionWarning: Unhandled promise rejection (r ejection id: 1): Error: spawn cmd ENOENT [1] (node:4796) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node. js process with a non-zero exit code. 

Я прошел через разные вопросы и ответы в SO, но не смог узнать, что такое «Unhandled Promise Rejection».

Может ли кто-нибудь просто объяснить мне, что это такое, а также то, что Error: spawn cmd ENOENT , когда он возникает, и что я должен проверить, чтобы избавиться от этого предупреждения?

Происхождение этой ошибки заключается в том, что каждое promise, как ожидается, будет обрабатывать обетование, то есть иметь .catch (…) . вы можете избежать этого, добавив .catch (…) к обещанию в коде, как указано ниже.

например, функция PTest () будет либо разрешать, либо отклонять promise, основанное на значении глобальной переменной somevar

 var somevar = false; var PTest = function () { return new Promise(function (resolve, reject) { if (somevar === true) resolve(); else reject(); }); } var myfunc = PTest(); myfunc.then(function () { console.log("Promise Resolved"); }).catch(function () { console.log("Promise Rejected"); }); 

В некоторых случаях сообщение «необработанное promise» приходит, даже если у нас есть .catch (..), написанный для обещаний. Это все о том, как вы пишете свой код. Следующий код генерирует «необработанное promise», даже если мы обрабатываем catch .

 var somevar = false; var PTest = function () { return new Promise(function (resolve, reject) { if (somevar === true) resolve(); else reject(); }); } var myfunc = PTest(); myfunc.then(function () { console.log("Promise Resolved"); }); // See the Difference here myfunc.catch(function () { console.log("Promise Rejected"); }); 

Разница в том, что вы не обрабатываете .catch(...) как цепочку, а как отдельную. По какой-то причине механизм JavaScript рассматривает это как promise без отказа от отказа от обещаний.

Это когда Promise завершается с .reject() или исключение было .reject() в выполненном асинхронном коде, а .catch() не обработало отклонение.

Отклоненное promise похоже на исключение, которое всплывает к точке входа приложения и заставляет обработчик ошибок root производить этот вывод.

См. Также – https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/rejecthttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference / Global_Objects / Promise – https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

Обещания могут быть «обработаны» после их отклонения. То есть, можно вызвать обратный вызов отклонения обещания перед предоставлением обработчика catch. Такое поведение немного надоедает мне, потому что можно писать …

 var promise = new Promise(function(resolve) { kjjdjf(); // this function does not exist }); 

… и в этом случае promise отвергается молча. Если кто-то забывает добавить обработчик catch, код будет продолжать бесшумно запускаться без ошибок. Это может привести к затяжным и труднодоступным ошибкам.

В случае Node.js есть разговоры об обработке этих необработанных отказов Promise и отчетности о проблемах. Это приводит меня к ES7 async / await. Рассмотрим этот пример:

 async function getReadyForBed() { let teethPromise = brushTeeth(); let tempPromise = getRoomTemperature(); // Change clothes based on room temperature let temp = await tempPromise; // Assume `changeClothes` also returns a Promise if(temp > 20) { await changeClothes("warm"); } else { await changeClothes("cold"); } await teethPromise; } 

В приведенном выше примере предположим, что зубы были пропущены (ошибка: из зубной пасты!) До того, как была выполнена функция getRoomTemperature. В этом случае будет необработанное отклонение Обещания до тех пор, пока не дожидается зубы.

Я хочу сказать, что … если мы рассмотрим необработанные отказы Обещания, обещания, которые позже обрабатываются ожиданием, могут быть непреднамеренно представлены как ошибки. Опять же, если мы рассмотрим необработанные отказы Promise, чтобы они не были проблематичными, законные ошибки могут не сообщаться.

Мысли об этом?

Это связано с обсуждением в проекте Node.js:

По умолчанию необработанное поведение обнаружения отказа

если вы пишете код таким образом:

 function getReadyForBed() { let teethPromise = brushTeeth(); let tempPromise = getRoomTemperature(); // Change clothes based on room temperature return Promise.resolve(tempPromise) .then(temp => { // Assume `changeClothes` also returns a Promise if (temp > 20) { return Promise.resolve(changeClothes("warm")); } else { return Promise.resolve(changeClothes("cold")); } }) .then(teethPromise) .then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected } 

Когда вызывается getReadyForBed, он будет синхронно создавать окончательное (не возвращенное) promise, которое будет иметь ту же ошибку «необработанного отклонения», что и любое другое promise (может быть, конечно, ничего, в зависимости от движка). (Я нахожу очень странным, что ваша функция ничего не возвращает, что означает, что ваша функция async дает promise для неопределенного.

Если я сделаю Promise прямо сейчас без улова и добавлю один позже, большинство реализаций «необработанной ошибки отклонения» фактически отменит предупреждение, когда я его обработаю позже. Другими словами, async / await не изменяет обсуждение «необработанного отклонения» каким-либо образом, что я вижу.

чтобы избежать этой ошибки, напишите код следующим образом:

 async function getReadyForBed() { let teethPromise = brushTeeth(); let tempPromise = getRoomTemperature(); // Change clothes based on room temperature var clothesPromise = tempPromise.then(function(temp) { // Assume `changeClothes` also returns a Promise if(temp > 20) { return changeClothes("warm"); } else { return changeClothes("cold"); } }); /* Note that clothesPromise resolves to the result of `changeClothes` due to Promise "chaining" magic. */ // Combine promises and await them both await Promise.all(teethPromise, clothesPromise); } 

Обратите внимание, что это должно предотвратить любое необработанное promise.

« Удержание устаревания : отказ от необработанных обещаний устарел»

TLDR: promise имеет resolve и reject , делая reject без улова для обработки, оно устарело, поэтому вам нужно хотя бы catch на верхнем уровне.

  • Подключение express.js с помощью Angular CLI в среде dev
  • Если вы не используете. (Dot) в своих моделях AngularJS, вы делаете это неправильно?
  • Как игнорировать начальную загрузку при просмотре изменений модели в AngularJS?
  • Функция угловой области, выполняемая несколько раз
  • Как использовать $ http promise ответ вне успеха обработчик
  • Модули и конфликты имен / имен в AngularJS
  • ngFor с индексом как значение в атрибуте
  • Угловые параметры SIS
  • AngularJS: Когда использовать сервис вместо заводского
  • Обнаружение изменения смены вручную вручную
  • как использовать дорожку внутри ngFor угловой 2
  • Давайте будем гением компьютера.