Могут ли чистые функции быть асинхронными?

Проходя через определение чистых функций, он обычно определяется двумя трейтами:

1) Должен выдавать одинаковый результат при одном и том же входе

2) Не должно вызывать побочных эффектов.

Означает ли это также, что чистая функция не должна быть асинхронной? Если нет, то как? Если да, я хотел бы увидеть несколько примеров чистой асинхронной функции в JavaScript.


person Anish K.    schedule 06.10.2018    source источник
comment
На ваш взгляд, new Promise(() => {}) !== new Promise(() => {}) нарушает черту 1? За исключением того, что это не один и тот же объект, промисы ведут себя одинаково.   -  person Patrick Roberts    schedule 06.10.2018
comment
@PatrickRoberts Я думаю, это нарушает правило № 1, поскольку технически мои выходные данные не будут одинаковыми при двойном вызове одной и той же функции.   -  person Anish K.    schedule 06.10.2018
comment
Не согласен - если ссылочное равенство является требованием чистоты, то любая функция, возвращающая объект в javascript, не может считаться чистой.   -  person dvlsg    schedule 06.10.2018


Ответы (2)


Да, асинхронная функция обычно не является чистой, так как противоречит требованию №2: отсутствие побочных эффектов.

Большинство вещей, для которых мы используем асинхронные функции, по своей сути имеют побочные эффекты: ввод-вывод, сетевые функции, таймеры. Но даже если мы проигнорируем их, только обещания полагаются на какое-то глобальное состояние для своей асинхронности: цикл событий. Обычно это не вписывается в наше определение чистоты.

С другой стороны, мы можем просто игнорировать их, когда спорим о чистоте наших функций, точно так же, как мы игнорируем все низкоуровневые эффекты и тайминги, которые имеют вычисления на нашей реальной машине. Если вы хотите утверждать, что ваша асинхронная функция является чистой, вы всегда должны явно заявлять об этом предположении. При споре об эквивалентности двух асинхронных значений вам нужно будет иметь сложное представление о том, как вы моделируете асинхронные эффекты, например. в оценке Promise.race.

person Bergi    schedule 06.10.2018

да, асинхронные функции ничем не отличаются от обычных функций, за исключением того, что асинхронность означает, что она возвращает Promise<T>, а не просто T, с учетом сказанного, это единственное отличие от синхронизирующих функций, которые могут быть чистыми, следовательно, асинхронные функции тоже могут быть чистыми

пример:

async function willBeValue<T>(value: T): Promise<T> { return await value; }
person Trident D'Gao    schedule 06.10.2018
comment
В отличие от C#, await здесь не нужен. - person Patrick Roberts; 06.10.2018
comment
@АнишК. Что вы пытаетесь проверить с помощью x == y? - person Bergi; 06.10.2018
comment
@Bergi Берги Я хотел написать willBeValue(1) == willBeValue(1), возвращает false, тем самым нарушая правило № 1. Однако редактировать комментарии не удалось, так как они блокируются через 5 минут. - person Anish K.; 06.10.2018
comment
@АнишК. Нет, когда мы хотим судить о чистоте функций, они должны возвращать эквивалентные результаты. Не совсем такие же. == проверяет идентичность объекта, а это не то, что нам нужно. Мы хотим рассматривать массив [1] и другой массив [1] как равные (обычно), даже если они не являются одним и тем же массивом. - person Bergi; 06.10.2018
comment
видимо этот пример и @bergi - person TruongSinh; 23.02.2019