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:09. |