Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

В JavaScript плоске теж краще ніж вкладене, чи ні?

with 6 comments

Яваскрипт такий асинхронний, що найчастіше, аби щось одне виконувалось після другого, треба засунути те одне в функцію і передати її як колбек другому, а друге вже викличе цей колбек коли само завершиться.

Наприклад коли треба завантажити десять бібліотек одну за іншою… Але багато вкладень доводять до того що код не влізається в 80 символів, і хоча в екрани в наш час дуже широкі, та все одно читати неприємно. Тому я взяв і написав таке:

   
/*
    callbackStack is function which
    trasforms nested callbacks from this form:

    load('lib1', function() {
        load('lib2', function() {
            load('lib3', function() {
                ...
                    finally_execution();
                ...
            });
        });
    });
    
    to this form:

    callbackStack(['lib1', 'lib2', 'lib3', ... ], load, finally_execution);
*/
var callbackStack = function(param_list, func_to_call, final_callback) {
    var stack = final_callback;
    var stack_this = function(param, stack) {
        return function () {
            func_to_call(param, stack);
        };
    };
    for(var i = param_list.length - 1; i >= 0;i--) {
        stack = stack_this(param_list[i], stack);
    }
    stack();
};
 
// Example:
var function_with_callback = function (param, cb) {
    console.log(param);
    cb();
};
var ok = function() {
    console.log('ok!');
};
var param_list = ['lib1', 'lib2', 'lib3', 'lib4', 'main'];
var test = function () {
    callbackStack(param_list, function_with_callback, ok);
};
test();

Цей код ще не рев’ювили, тому вирішив поділитись тут. А то раптом я пропустив якийсь підводний камінь з замиканнями і написав якусь цікаву багу, яку хтось помітить…

Advertisements

Written by bunyk

Червень 12, 2013 at 14:06

Оприлюднено в Кодерство, Павутина

Tagged with

Відповідей: 6

Subscribe to comments with RSS.

  1. Хоча, перше на що треба дивитись – а чи нема в функції load аналога що приймає масив? 🙂

    bunyk

    Червень 12, 2013 at 15:33

    • Логічно. І як, є?

      danbstt

      Червень 12, 2013 at 19:38

      • Та ніби є, але до мене писали вкладеними колбеками. А запитати чому вони так роблять я ще не встиг, бо ж дедлайн здається вже минув. Але якось при нагоді запитаю. 🙂

        bunyk

        Червень 12, 2013 at 21:37

  2. Continuation monad, нє? 🙂

    zzz

    Червень 18, 2013 at 13:39


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: