Как ковбой говорит в комментариях здесь, мы все хотим" написать [неблокирующий JavaScript] асинхронный код в стиле, подобном этому:
try
{
var foo = getSomething(); // async call that would normally block
var bar = doSomething(foo);
console.log(bar);
}
catch (error)
{
console.error(error);
}
"
Итак, люди придумали решение этой проблемы, например
- библиотеки обратного вызова (например, async)
- promises
- шаблоны событий
- streamline
- и
- generators.
Но ни одно из них не приводит к тому, что код такой же простой и понятный, как код стиля синхронизации выше.
Итак, почему компиляторы/интерпретаторы javascript не могут просто блокировать заявления, которые мы в настоящее время знаем как "блокирующие"? Итак, почему компиляторы/интерпретаторы javascript не могут обрабатывать синтаксис синхронизации выше AS, если бы мы написали его в стиле асинхронизации? "
Например, при обработке getSomething()
выше, компилятор/интерпретатор мог просто сказать: "Этот оператор является вызовом [файловой системы/сетевого ресурса /...], поэтому я сделаю заметку для прослушивания ответов от этого звонка, а тем временем и с тем, что в моем цикле событий". Когда вызов вернется, выполнение может перейти к doSomething()
.
Вы все равно сохранили бы все основные функции популярных сред выполнения JavaScript
- однопоточный
- цикл событий
- блокирующие операции (I/O, сеть, таймеры ожидания) обрабатываются "асинхронно"
Это будет просто настройка синтаксиса, которая позволит интерпретатору приостанавливать выполнение любого заданного бита кода всякий раз, когда IT DETECTS выполняет асинхронную операцию, и вместо необходимости обратного вызова код просто продолжается после строки после вызова асинхронного вызова когда вызов возвращается.
Как Джереми говорит
в среде выполнения JavaScript нет ничего, что будет превентивно приостановить выполнение заданной задачи, разрешить выполнение какого-либо другого кода на некоторое время, а затем возобновите исходную задачу
Почему бы и нет? (Как в "Почему этого не может быть?"... Меня не интересует урок истории)
Почему разработчик должен заботиться о том, блокирует ли оператор или нет? Компьютеры предназначены для автоматизации того, что люди плохо себя чувствуют (например, записывая неблокирующий код).
Вы могли бы реализовать его с помощью
- выражение типа
"use noblock"
;"use strict";
), чтобы включить этот режим для всей страницы кода. EDIT:"use noblock"
; был плохим выбором и ввел в заблуждение некоторых ответчиков, что я пытался вообще изменить характер обычных сценариев JavaScript. Что-то вроде'use syncsyntax';
может лучше описать его. - какой-то оператор
parallel(fn, fn, ...);
, позволяющий выполнять операции параллельно, в"use syncsyntax"
; mode - например, для одновременного запуска нескольких асинхронных действий. - EDIT: простой синтаксис стиля синхронизации
wait()
, который будет использоваться вместоsetTimeout()
в"use syncsyntax"
; Режим
ИЗМЕНИТЬ:
В качестве примера вместо записи (стандартная версия обратного вызова)
function fnInsertDB(myString, fnNextTask) {
fnDAL('insert into tbl (field) values (' + myString + ');', function(recordID) {
fnNextTask(recordID);
});
}
fnInsertDB('stuff', fnDeleteDB);
Вы можете написать
'use syncsyntax';
function fnInsertDB(myString) {
return fnDAL('insert into tbl (field) values (' + myString ');'); // returns recordID
}
var recordID = fnInsertDB('stuff');
fnDeleteDB(recordID);
Версия syncsyntax
будет обрабатываться точно так же, как и стандартная версия, но гораздо проще понять, что программист намеревался (если вы понимаете, что syncsyntax
приостанавливает выполнение этого кода, как обсуждалось).