Однако, на самом деле в EcmaScript есть специальный синтаксис, еще сильнее упрощающий такие задачи. Он называется object spread, использовать его можно при помощи транспилятора Babel.
А можно ссылку в спецификации про object spread? Потому что ни в последнем Chrome, ни в FF, ни в node.js 6/7 "из коробки" эта возможность не работает. Однако по таблице поддержки из статьи spread везде поддерживается полностью. Полагаю, что это какая-то драфтовая возможность
Странная мания пошла популяризировать фичи, которые еще не скоро появится. Да, у async-await — stage 3, но официальную публикацию спецификации планируют "аж" в 2017, а поддержка в браузерах и того боле. Все-таки, в мире javascript решения плодятся быстрее, чем дрожжи, и полгода-год — это очень много.
Вся эта катавасия, с новыми фишками, вынуждает использовать всякие babelы-транспайлеры, которые фаршируют код в непредсказуемую кашу с возможными багами. Выполнение кода на серверной стороне должно быть максимально безопасным и предсказуемый, а транспайлеры убивают все это в пух и прах.
Да, неверно сформулировал.
Имелось в виду, что получение результата происходит в функции инициализации, а синхронно или асинхронно вызывается resolve — не суть важно.
// Первое разрешение обещания
promise.then(function(result){
// При разрешении обещания происходит асинхронный вызов,
// результат которого передается в эту функцию
});
// Повторное разрешение того же обещания
promise.then(function(result){
// Теперь уже асинхронный вызов не выполняется.
// В эту функцию передается сохраненный результат
// разрешения обещания
});
Не верно это.
Получение результата промиса происходит во время синхронной инициализации самого промиса:
console.log('1');
const promise = new Promise(resolve => {
resolve('result');
console.log('2');
});
console.log('3');
/*
В консоль выведется 1,2,3, а promise уже содержит готовый результат 'result'
*/
Вызов разрешающей функции then вообще не нужен для получения и сохранения результата внутри промиса, т.к результат всегда получается по время инициализации самого промиса. then нужен только для "извлечения" этого результата
Очень надоедливая проблема. Я нашел ее решение в этой статье (к сожалению, только для OS X).
Может кому-то будет полезно, если он не привязан к JetBrains продуктам.
import a from 'a';
import b from 'b';
import c from 'c';
export default { a, b, c }
Больше вопрос возникает — где такое может реально понадобиться? На практике не помню, чтобы встречал подобное, поэтому интересно было бы посмотреть на пример использования.
Это вопрос не в рамках статьи, но если говорить, про tree-shaking, то CommonJS предполагает разбиение на маленькие модули, которые будут непосредственно импортироваться (тот же lodash). Например, хелперы будут выглядеть, как множество отдельный файлов с одним методом. Фактически tree-shaking делается "руками", поэтому нельзя сказать, что это минус. Скорее специфика CommonJS.
Статья больше в контексте сервера (как сказали комментарием ниже) — это наиболее частый сценарий при использовании node.js.
Если же использовать node.js, как, например, bash-скрипт, то тогда нет большой необходимости использовать require в начале файла, потому что при исполнении скрипта синхронные операции могут быть вполне ожидаемы и даже необходимы.
Но опять же — это ситуативно, и может запутать, если на вашем проекте серверный код написан с вынесением require вверх файла, а в node.js-скриптах уже по месту востребования. Лично я бы везде придерживался одного стиля — стараться использовать require/exports только вверху.
А можно ссылку в спецификации про object spread? Потому что ни в последнем Chrome, ни в FF, ни в node.js 6/7 "из коробки" эта возможность не работает. Однако по таблице поддержки из статьи spread везде поддерживается полностью. Полагаю, что это какая-то драфтовая возможность
Может немного оффтоп, но все же.
Странная мания пошла популяризировать фичи, которые еще не скоро появится. Да, у async-await — stage 3, но официальную публикацию спецификации планируют "аж" в 2017, а поддержка в браузерах и того боле. Все-таки, в мире javascript решения плодятся быстрее, чем дрожжи, и полгода-год — это очень много.
Вся эта катавасия, с новыми фишками, вынуждает использовать всякие
babel
ы-транспайлеры, которые фаршируют код в непредсказуемую кашу с возможными багами. Выполнение кода на серверной стороне должно быть максимально безопасным и предсказуемый, а транспайлеры убивают все это в пух и прах.Все ИМХО
Да, неверно сформулировал.
Имелось в виду, что получение результата происходит в функции инициализации, а синхронно или асинхронно вызывается
resolve
— не суть важно.Не верно это.
Получение результата промиса происходит во время синхронной инициализации самого промиса:
Вызов разрешающей функции
then
вообще не нужен для получения и сохранения результата внутри промиса, т.к результат всегда получается по время инициализации самого промиса.then
нужен только для "извлечения" этого результатаОчень надоедливая проблема. Я нашел ее решение в этой статье (к сожалению, только для OS X).
Может кому-то будет полезно, если он не привязан к JetBrains продуктам.
Если правильно понял, то что-то такое:
Больше вопрос возникает — где такое может реально понадобиться? На практике не помню, чтобы встречал подобное, поэтому интересно было бы посмотреть на пример использования.
Это вопрос не в рамках статьи, но если говорить, про tree-shaking, то CommonJS предполагает разбиение на маленькие модули, которые будут непосредственно импортироваться (тот же
lodash
). Например, хелперы будут выглядеть, как множество отдельный файлов с одним методом. Фактически tree-shaking делается "руками", поэтому нельзя сказать, что это минус. Скорее специфика CommonJS.Статья больше в контексте сервера (как сказали комментарием ниже) — это наиболее частый сценарий при использовании
node.js
.Если же использовать
node.js
, как, например,bash
-скрипт, то тогда нет большой необходимости использоватьrequire
в начале файла, потому что при исполнении скрипта синхронные операции могут быть вполне ожидаемы и даже необходимы.Но опять же — это ситуативно, и может запутать, если на вашем проекте серверный код написан с вынесением
require
вверх файла, а вnode.js
-скриптах уже по месту востребования. Лично я бы везде придерживался одного стиля — стараться использоватьrequire/exports
только вверху.