Bluebird практически де-факто является стандартом для Node.js. Многие популярные библиотеки используют его вместо стандартных обещаний, и причина кроется в расширенном и удобном наборе функций. Веб, как правило, поставляется с ужасными API. Рассмотрим, например, WebSocket. Назначение обратных вызовов после инициализации соединения, отсутствие двухфазной инициализации, отсутствие поддержки addEventListener () и т. Д.

async/awaitупен с версией узла 8. Код впервые является линейным в nodejs. Это хорошо. Ранее во многих статьях говорилось, что в движке javascript v8 есть функция сtry/catch блок не оптимизирован. В настоящее время,async/await требуетtry/catch блоки для устранения ошибок. Итак, как разработчику, что нужно сделать, чтобы сохранить производительность?

 PVermeer26 апр. 2018 г., 11:41
Я не думаю, что вам нужно использовать try / catch, если вы инициируете что-то вроде этого: 'userService.logIn (req, res) .then (result => res.json (result)) .catch (error => next (ошибка));' каждый отказ / бросок вниз по линии (если не пойман там) будет обрабатываться здесь.
 guest27131429 сент. 2017 г., 06:37
Вы пытались использовать.catch()?
 guest27131429 сент. 2017 г., 08:45
@ jfriend00 Нет, не поймите, на какой конкретный шаблон вы ссылаетесь.
 guest27131429 сент. 2017 г., 08:42
@ jfriend00 Какой конкретный шаблон использовать.catch() вasync/await вы ссылаетесь?(async() => { "use strict"; await abc })() .then(result => console.log("resolved:", result)) .catch(err => console.error("rejected:", err))
 jfriend0029 сент. 2017 г., 08:47
@ guest271314 - Пожалуйста, оставайтесь здесь по теме. Чтобы поймать отказ на более высоком уровне, который происходит в блоке, где несколькоawait заявления используются, вы должны использоватьtry/catch, Если вы этого не понимаете, тогда, пожалуйста, прочитайте оawait и отклонения. Я не собираюсь информировать вас об этом в комментариях здесь. Это аналогично.catch() используется в конце цепочки обещаний, но при использовании несколькихawait заявления вместо цепочки обещаний, нельзя использовать только.catch() чтобы поймать отказ на более высоком уровне.

Ответы на вопрос(2)

Решение Вопроса

try/catch получил оптимизации TurboFan в коммите9aac80f для V85.3 (Узелv7.x и выше). Это означает, что историческое утверждение о том, чтоtry/catch имеет плохую производительность, больше не соответствует действительности.
ИзСообщение в блоге V8:

В прошлом у V8 были трудности с оптимизацией языковых функций, которые есть в ES2015 +. Например, никогда не было возможно добавить обработку исключений (т.е.try/catch/finally) поддержка Crankshaft, классического оптимизирующего компилятора V8. Это означало способность V8 оптимизировать функцию ES6, такую ​​какfor...of, который по сути имеет неявное предложение finally, было ограничено. Ограничения коленчатого вала и общая сложность добавления новых языковых функций в полнофункциональный компилятор V8, базовый компилятор V8, по своей сути затрудняли обеспечение того, чтобы новые функции ES были добавлены и оптимизированы в V8 так же быстро, как они были стандартизированы.

К счастью, Ignition и TurboFan (новый конвейер интерпретатора и компилятора V8) с самого начала были разработаны для поддержки всего языка JavaScript, включая расширенный поток управления, обработку исключений и совсем недавно.for...of и деструктуризация от ES2015. Тесная интеграция архитектуры Ignition и TurboFan позволяет быстро добавлять новые функции и оптимизировать их быстро и постепенно.

try/catch вasync функция просто синтетический сахар над обещанием.then а также.catch методы и производительность, следовательно, определяются базовой реализацией Promise. певчая птицатребования иметь лучшую производительность, чем нативные реализации Promise, поэтому теоретически - если то, что утверждает Bluebird - правда, - вы достигнете лучшегоtry/catch производительность путем переопределения собственной реализации Promise с помощью реализации Promise в Bluebird.
Например, в узле:const Promise = require("bluebird"), или жеglobal.Promise = require("bluebird") переопределить это глобально.

Однако обратите внимание, что это может измениться в будущем, так как исходная реализация Promise была в JavaScript, но недавно была повторно реализована в C ++, что можно отследить в ошибке# 5343.

 jfriend0029 сент. 2017 г., 08:56
Да, я знаю, что это тип оптимизации. Заданный вопрос оtry/catch производительность сasync/await в nodejs версии 8, о которой вы действительно не предлагали никакой определенной информации. Как быстроawait сейчас сtry/catch по сравнению с тем, что было раньше? Или по сравнению с программированием безasync/await и просто используя обещания и.catch()? Это та информация, которая на самом деле ответит на вопрос.
 Sven29 сент. 2017 г., 08:53
@ jfriend00 TurboFan - один из компиляторов оптимизации V8. Узнайте больше здесь:github.com/v8/v8/wiki/TurboFan
 jfriend0029 сент. 2017 г., 08:50
Что значит получать оптимизации TurboFan?

Производительность обещаний ES2015 и асинхронных функций ES2017 в Node.js v8

Производительность обратных вызовов против обещаний и асинхронных функций в Node.js v8

Обе обещания Chrome V8 ES2015 и асинхронные функции ES2017 работают примерно в 2 раза медленнее, чем обещания Bluebird, используя почти в 2 раза больше памяти

а также

Заключение

Node.js v8 поставляется со значительно улучшенной производительностью нативных обещаний ES2015 и асинхронных функций ES2017, дополнительно усиленных введением нативного util.promisify.

 Pac029 сент. 2017 г., 12:37
Bluebird - это Node.JS? Я думал, что Chrome V8 был двигателем для Node. Я смущен здесь, вы можете уточнить, пожалуйста?
 Brian Haak13 июн. 2018 г., 08:37
Bluebird практически де-факто является стандартом для Node.js. Многие популярные библиотеки используют его вместо стандартных обещаний, и причина кроется в расширенном и удобном наборе функций. Веб, как правило, поставляется с ужасными API. Рассмотрим, например, WebSocket. Назначение обратных вызовов после инициализации соединения, отсутствие двухфазной инициализации, отсутствие поддержки addEventListener () и т. Д.
 ponury-kostek29 сент. 2017 г., 12:58
@ Pac0Bluebird Является ли пользовательская реализация землиPromise
 user83561109 окт. 2017 г., 16:26
Пакет Bluebird был очень полезен, когда Promises не были доступны изначально. Но их реализация обещания не полностью соответствует спецификации. Вот почему реализация V8 немного медленнее. Реализация значительно улучшилась и почти на одном уровне с BlueBird. Я бы использовал родные обещания, поскольку у вас есть соответствие спецификациям, никаких дополнительных зависимостей, и вы получите выгоду от будущих оптимизаций движка.

Ваш ответ на вопрос