new!
То есть для заказчика нужно чтобы:
Класс вызывался как await ClassName() и как new ClassName()
Пока пришло в голову только такое решение:
const F = function() {
// Вызов через await
if ((this instanceof F) == false) {
return Promise.resolve('Вы вызвали через await!');
}
// Вызов через new
console.log('Вы вызвали через new!');
};
(async () => {
new F();// Вы вызвали через new!
console.log(await F());// Вы вызвали через await!
})();
Есть какое-то другое решение задачи? :)
ну и херня, кнчн) люди чё только не фантазируют вызов через await что делать должен? это типа реализация асинхронного конструктора, что ли? фабрика тогда поудобнее будет
await должен вернуть конечный результат, а если через new то к нему можно прицепится и получать данные в онлайн режиме например: (async () => { // Быстро console.log(await F());// Функция выполнина! // Подробно new F() .on(() => { // Тут, что-то приходит при новой итерации. }) .onEnd(() => { // Функция выполнина! }); })(); То есть await это сокращение если мне не нужно знать что там в данный момент происходит, а я просто хочу узнать конечный результат, я вместо (async () => { new F() .onEnd(() => { // Функция выполнина! }); })(); напишу так (async () => { console.log(await F());// Функция выполнина! })();
нельзя просто метод-то асинхронный добавить и сделать await F.execute() ?
ладно, может, я чего-то не понимаю, просто тут именно я не понимаю зачем хд
Можно конечно, но задача в том, чтобы получить класс без методов. В основном будет использоваться new, но иногда если нет необходимости получать промежуточный результат, то будет использоваться await И тут есть разница в вашем случае это await F.execute() В этом же случае это просто await F() Понимаете в чем разница?
Не совсем понял что нужно и для чего, но, например, из конструктора ты можешь возвращать промис class AsyncConstructor { constructor(name) { return new Promise((resolve) => setTimeout(() => resolve(this), 2000)) } } async function someFunc () { const myClass = await new AsyncConstructor() console.log(myClass) } someFunc()
Вот пример (async () => { // Если НЕ нужен промежуточный результат console.log(await F());// Конечный результат! // Если нужен промежуточный результат new F(() => { // Конечный результат! }) .on(() => { // Промежуточный результат! }) })(); Вы же предлагаете сделать так (async () => { // Если НЕ нужен промежуточный результат console.log(await F().someFunc());// Конечный результат! // Если нужен промежуточный результат new F(() => { // Конечный результат! }) .on(() => { // Промежуточный результат! }) })();
ну так это обычный промис
Стоит задача работать с классом и через await и через new То есть Класс вызывался как await ClassName() и как new ClassName()
да пожалуйста, просто не нужно рассказывать, что читаемость становится лучше, это ужасный апи
То есть этот вариант лучше await F().someFunc() Чем этот вариант? await F()
если f это функция, то лучше второй, если класс, то первый
ну я понял ваш подход к написанию кода)
вот и день не зря прошел, получается
я-то понимаю, только это не удобнее + путанница. надо промис - берите промис. не вижу в этом никакого удобства. имхо, естественно
Понимаете еще в чем дело, в Класс нужно передавать аргументы. Получается выбор даже такой await F.someFunc(args) Вместо await F(args)
Соответственно и содержимое конструктора внутри нужно дублировать или выносить в отдельный метод
звучит как проблемы из воздуха, короче. неинтуитивный апи, который ещё нужен непонятно зачем. тут явно напрашивается метод, который возвращает промис, да и всё - вот вам и await, вот вам и then, catch. а какой там промежуточный результат - я вообще в толк не возьму видимо, я просто не прочувствовал фишку
Хорошо вот задача. Нужно выполнить массив команд в консоли. Вот ваше решение new Exec([ 'command1', 'command2', 'command3' ]) .onEnd(() => { // Общий результат всех команд }) Но что если нам нужен дополнительный callback чтобы получить результат выполнения каждой команды и потом общий результат Ваше решение new Exec([ 'command1', 'command2', 'command3' ]) .onCommand(() => { // Результат каждой команды }) .onEnd(() => { // Общий результат всех команд }) И ваше решение полностью совпадает с моим до этого момента! Теперь нужно также иметь возможность получать общий результат через промис Ваше решение await Exec.someFunc([ 'command1', 'command2', 'command3' ]) Я же предлагаю просто await Exec([ 'command1', 'command2', 'command3' ]) Постарайтесь объединить все это в голове, это 1 класс, один.., который должен выполнять и эту, и эту, и эту задачи!
я и изначально всё понял на таком уровне, просто вы можете реализовать все ваши крутые фичи, а потом в другом методе вернуть промис и дёрнуть эти ваши крутые фичи, зарезолвив промис онЕнд. всё просто и без лишних гадостей
В любом случае спасибо, что уделили время!
Обсуждают сегодня