promises. почему так запилено?
Че-то я думаю-думаю, и не могу понять, почему в JS (после стольких лет ожиданий и надежд от избавления от callback-hell), запилили настольок уродливую парашу? Ведь, по идее, JS -- это ООП язык, а в Ъ асинхронные сообщения запиливаются по другому.
Суть в том, что, чтобы наше дерьмо возвратило обещание, нам надо предварительно это подготовить с помощью new Promise, тогда как в нормальных ООП-языках, мы имеем возможность асинхронно отправить сообщение независимо от его реализации. Почему так сделали? Причина в каких то ограничениях языка? Или просто дезигнеры че-то попутали? |
Хз, порой кажется, что увидали они callback-hell, ужаснулись и зафигачили первое, что пришло в голову. Symbol тоже мне кажется тотальным overmind'ом.
Но там вроде теоретически предположительно наверное скорее всего должны сидеть умные ребята, может это мы просто |
Обещания - это не финальное решение для обеспечения удобной работы с асинхронщиной, а лишь шаг на пути к нему. Сейчас идет разработка фичи async functions, которая обеспечит асинхронную работу без увеличения стека, с нормальным синтаксисом и перехватом ошибок.
Выглядит так: async function loadUser(id) { let user; try { let response = await fetch(`/api/users/${id}`); user = response.body; } catch (error) { console.error(error); } return user; } Новейший текст спецификации - http://tc39.github.io/ecmascript-asyncawait/. Это то? |
Erolast, да знаем про async - нормальное решение. Знаем и почему промисы - обратная совместимость. И всё же и всё же...
|
Цитата:
someMethod := casualMethod(some code returns some value) casualVar := someMethod aFuture := @someMethod aFuture println casualVar ptintln 1 println // выхлоп будет >>some value >>1 >>some value // -- из фьючера подозреваю, что это не совсем то. Во всяком случае, async/await -- точно не то |
Цитата:
|
Erolast,
Спасибо, не могу плюсануть в карму, форум, наверное глючит, пишет должны добавить кому то еще, я добавил Aetae, он один х*й, не дает. разлогинивание тоже не помогло, а плюсовал я тебе, ЕМНИП, вчера, так что извиняй:) UPD А не, добавилось вроде, че то я запутался, может не я плюсанул, ну ладно, х с ним. |
Цитата:
//Плюсанул я, но это всё не важно) |
Safort,
Детсад какой-то. 2 раза не прокатило, поэтому, попытки прекращаю, как то смешно получается, можно покраснеть от этого нелепого конфуза:) |
Да, система кармы тут, по меньшей мере, странная - ни для выражения благодарности, ни для саморегуляции не годится) Запилили бы хотя бы обычные лайки с указанием числа у каждого поста - я считаю, куда лучше б было.
|
Цитата:
На астрофоруме повторно + можно ставить только через 72 часа. Мне кажется было бы разумно |
Цитата:
я как-то одному челу карму дрочил, только три раза минусанул, потом психанул :) |
И по теме - а чем промисы(не называйте их обещаниями, не трахайте мой девственный мозг)))) так не удобны? - http://learn.javascript.ru/promise
|
Удобность - понятие относительное. Относительно традиционных коллбеков - да, штука классная. Относительно async/await - то еще говно:
//async/await async function loadUser(id) { let user; try { let response = await fetch(`/api/users/${id}`); user = response.body; } catch (error) { console.error(error); } return user; } //Promises function loadUser(id) { return new Promise((resolve) => { fetch(`/api/users/${id}`).then((response) => { return response.body; }).catch((error) => { console.log(error); return undefined; }).then((user) => { resolve(user); }); }); } И это простейший пример, без нескольких поочередных запросов и без циклов. |
Цитата:
========================= До Babel //async/await async function loadUser(id) { let user; try { let response = await fetch(`/api/users/${id}`); user = response.body; } catch (error) { console.error(error); } return user; } После Babel //async/await "use strict"; function loadUser(id) { var user, response; return regeneratorRuntime.async(function loadUser$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: user = undefined; context$1$0.prev = 1; context$1$0.next = 4; return regeneratorRuntime.awrap(fetch("/api/users/" + id)); case 4: response = context$1$0.sent; user = response.body; context$1$0.next = 11; break; case 8: context$1$0.prev = 8; context$1$0.t0 = context$1$0["catch"](1); console.error(context$1$0.t0); case 11: return context$1$0.abrupt("return", user); case 12: case "end": return context$1$0.stop(); } }, null, this, [[1, 8]]); } немножко "не удобный" код... =================== ПОМОГИТЕ! Как при помощи fetch отправить POST запрос?! я делаю так var result = fetch('server.php?tesh=gjkhkj', { method: 'post', body: 'test=kosbeg&kosbeg=test' }) result.then(function(response) { return response.text() }).then(function(text) { console.log(text) })['catch'](function(ex) { // так ['catch'], а не так .catch из-за корявого полифила... console.log('fail') }) } на сервере так <?php print_r($_GET).'/n'; print_r($_POST).'/n'; к консоли массив $_POST пустой... как исправить?! |
PS: мир сошел с ума: я использую fetch вместо православного аякса,
и я учусь писать код на es6... проблемму решил: var result = fetch('server.php?tesh=gjkhkj', { method: 'post', *!* headers: { "Content-type": "application/x-www-form-urlencoded; charset=UTF-8" }, */!* body: 'test=kosbeg&kosbeg=test' }) result.then(function(response) { return response.text() }).then(function(text) { console.log(text) })['catch'](function(ex) { // так ['catch'], а не так .catch из-за корявого полифила... console.log('fail') }) } БЛЯ! довбаные хедеры не поставил... |
KosBeg,
Ну и чем это лучше обычного fetch=function(url, body){ return new Promise(function(resolve, reject){ with(new XMLHttpRequest){ open("POST", url) send(body) onreadystatechange=function(){ if(readyState==4){ if(status!=200) return reject(status) resolve(responseText) } } } }) } fetch("foo", "foo=bar&bar=baz") .then(function(s){alert(s)}) .catch(function(s){console.log(s)}) ? |
Цитата:
Ну, и вдобавок есть такие мелочи, как работа в строгом режиме, уместность в модульном окружении, поддержка отличных от GET запросов, поддержка установки заголовков, чтения заголовков и т.д. Кстати, чо там с множественным наследованием и решением задачи, которую тебе Кобеззза в ответ задал? |
Цитата:
Но, в принципе, да - без использования ES Harmony аналогичный по функциональности код выглядел бы именно так. Цитата:
Цитата:
Цитата:
fetch('server.php?tesh=gjkhkj', { method: 'post', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ test: 'kosbeg', kosbeg: 'test', }) }) Во-вторых, зачем указывать кодировку UTF8 в content-type? Она же и так дефолтная. Вобще, загляни на https://github.com/github/fetch#usage, там весьма хорошая памятка. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
я юзаю именно этот полифил Цитата:
Цитата:
моя тупость зашкаливает) |
Цитата:
лично я считаю что даный полифил не хуже своего кода, над ним работаю ребята в 100 раз круче тебя, и они то знают толк в извращениях) |
Цитата:
С другой стороны, если он тебе не нужен, можешь не заморачиваться. Абсолютно по*ю каким форматом сервер обменивается с клиентом, главное, чтобы тебе было удобно. Просто json -- это стандарт. Если ты сам себе хозяин, можешь положить на стандарты. |
Цитата:
Цитата:
![]() я не знаю как принять его) хотя например можно так let result = fetch('server.php?cool=javascript', { method: 'post', headers: { "Content-type": "application/x-www-form-urlencoded" }, body: 'param=' + JSON.stringify({ javascript: 'cool', es_modern: '6 aka 2015', }) }) result.then(function(response) { return response.text() }).then(function(text) { console.log(text) }) } ![]() |
Общем как меня не учи - я делаю так)
function getContent(timestamp) { toQueryString = function(data) { var query = '', i, push = function(key, value) { query += encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&'; }, key, value; for (key in data) { if (!Object.hasOwnProperty.call(data, key)) { continue; } value = data[key]; if ((typeof(data) === "object") && (data instanceof Array)) { for (i = 0; i < value.length; i++) { push(key, value[i]); }; } else { push(key, data[key]); }; }; return query.replace(/&$/, '').replace(/%20/g, '+'); }; var queryString = { 'timestamp': timestamp }; var result = fetch('server.php', { method: 'post', headers: { "Content-type": "application/x-www-form-urlencoded" }, body: toQueryString(queryString) }) result.then(function(response) { return response.json() }).then(function(text) { document.querySelector('#response').innerHTML = text.data_from_file; getContent(text.timestamp); })['catch'](function(ex) { getContent(timestamp); }) } |
Цитата:
|
Цитата:
$data = json_decode(file_get_contents('php://input'), true); Цитата:
|
Цитата:
|
Erolast,
с ходу возникла непонятка subClass.prototype = Object.create(superClass && superClass.prototype, ты почему тут перезаписываешь прототип сабклассу? если сабкласс наследует что-то у суперкласса, это не значит что он должен забыть о себе. Или я что-то не так понял? |
Erolast,
http://stackoverflow.com/questions/1...-post-with-php => Цитата:
|
Erolast,
и вот еще непонятка. я глянул в описании setPrototypeOf, судя по этому вот полифилу Object.setPrototypeOf = Object.setPrototypeOf || function(obj, proto) { obj.__proto__ = proto; return obj; } в качестве аргументов там объекты(настоящие), а у тебя if (superClass) { Object.setPrototypeOf(subClass, superClass); } функции (а-ля "классы"). Как это понимать? |
Цитата:
Object.setPrototypeOf(subClass.prototype, superClass && superClass.prototype); В контексте организации множественного наследования ничего не изменится. |
Цитата:
Object.setPrototypeOf - это то же, что и установка __proto__, только по стандарту ES6. И давай лучше в той теме общаться, здесь это оффтоп как-то. |
Цитата:
|
Цитата:
|
Erolast,
хорошо, ответ на этот пост читай в той теме |
Цитата:
надо "receive", а у тебя "recieve", может опечатка |
Цитата:
Просто я ж с ES6 переписывал, а там наследование устанавливается в момент объявления класса. |
Часовой пояс GMT +3, время: 06:32. |