JavaScript: синхронизация с асинхронными конвертерами - PullRequest
2 голосов
/ 03 июня 2011

1) Что лучше streamlinejs: https://github.com/Sage/streamlinejs или повествование: http://www.neilmix.com/narrativejs/? Любые другие libs?

2) Как работает любая из этих библиотек? (Я читаю документы, я ищу упрощенное объяснение того, что происходит за кулисами ..)

1 Ответ

2 голосов
/ 03 июня 2011

Что касается вопроса №2 .... в общем, эти вещи:

  1. разобрать javascript в некое абстрактное синтаксическое дерево (AST)
  2. преобразовать AST
  3. преобразовать преобразованное дерево обратно в javascript

Некоторое время назад я написал частичный преобразователь как опыт обучения.Я использовал uglify.js для разбора в AST, а затем обходчик дерева, который lib предоставляет для преобразований.Преобразования были общего назначения и производили код, который выглядел как конечный автомат - каждый шаг начинался с последовательности из 0 или более действий синхронизации и заканчивался асинхронным действием.Например, этот простой сценарий:

var fs = require('fs');
console.log(fs.readFile('input.js', _).toString('utf-8'));

будет преобразован в следующее:

var fs, $v_0;

function s_0() {
    fs = require("fs");
    fs.readFile("input.js", function(err, res) {
        if (err) s_err(err); else {
            $v_0 = res;
            s_1();
        }
    })
}

function s_1() {
    console.log($v_0.toString("utf-8"));
}

s_0()

Я полагаю, что упорядочение и тому подобное делают нечто очень похожее.Определенные структуры (циклы, try / catch) нуждаются в специальной передаче, но общий подход тот же - преобразование в конечный автомат.

Проблемы с этим подходом, которые я обнаружил, были:

1) это не локальная проблема - то есть любое асинхронное поведение, которое необходимо обработать, заражает все на всем пути вверх по стеку вызовов.

2) вам нужны метаданные функции, поэтому вы должны либо делать предположения, либо требовать, чтобы люди комментировалиих функции в некотором роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...