Pull to refresh

Comments 11

К сожалению, поскольку cb тут один на все вызовы, в таком генераторе невозможно выполнить несколько задач параллельно.

Исходное же решение допускало некоторую алгебру над ожидаемыми задачами, что позволяло распараллеливать нужные действия.
Для распараллеливания задач можно использовать Promises и передать cb в метод then.
Можно ли потом, после Promise, в методе cb сделать throw и обработать эту ошибку дальше по коду? В моем случае ошибка перестовала ловиться.
cb нужен для продолжения работы генератора, не больше. И, простите, чем будет отличаться объект ошибки в возвращённом массиве от того, что передаётся в функцию? Разве объекты передаются не при помощи ссылок?
Все верно, если передавать ошибку как параметр, но если непосредсвенно в коде далее случится исключение, его уже не поймать с помощью обычных try catch, которые будут выше вокруг cb функции… в своем время это доставило мне изрядно головной боли.
Ах, так вы об этом! Если честно, то я не знаю как можно применить конструкцию try-catch к асинхронным функциям. Даже в обычном коде. Наверное, именно поэтому первым параметром в callBack передаётся объект ошибки, именно поэтому стоит делать элементарную проверку
asyncFunc(param1,param2,function(err,data){
    if (err)
        doSomeThinkAboutError();
    ....
};


Или же с применением изложенного подхода
var tmp=yield asyncFunc(param1,param2,cb);
if (tmp[0])
    doSomeThinkAboutError();
...
Очень просто — Generator.prototype.throw(exception). См. последнюю часть этой статьи.
Именно с этого начался проект Rx еще в Microsoft RDS. Правда язык там был не яваскрипт а C#.
Автор ссылается на эту вещь в самом же начале своей статьи.
UFO landed and left these words here
Sign up to leave a comment.

Articles