1. JavaScript / Говнокод #11462

    +157

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    for (var inc = 0; inc < 100; inc++){
           var key = Math.random();
           client.set(inc, Math.random(), function(){
               client.get(inc, function(val){
                   console.log(inc);
               })
           });
    }

    "Какого хуя мне 100 раз по 100 возвращается?"
    Спросил у меня утром знакомый и отправил этот код.

    Запостил: хуита, 23 Июля 2012

    Комментарии (14) RSS

    • И какого?
      Так вроде обычный CPS.
      Ответить
    • Откуда пытливый читатель может знать, что такое client.set?
      Все, что отсюда видно читателю, так это то, что вторая строчка не нужна, все остальное - не понятно.
      Ответить
      • кажется мне, хотели написать так:client.set(inc, Math.random() key, function()...
        тока нахуя
        Ответить
      • Client - клиент к редисовскеой базе, и это совершенно не имеет значения на самом деле.
        Прикол в другом, client.get(inc) inc в этой ситуации будет всегда сылаться на последнее значение переменной (100).
        От того ему и выводится одно и то же значение. Соответственно, нужно юзать замыкания и код станет выглядеть так:
        for (var inc = 0; inc < 100; inc++){
            var key = Math.random();
            client.set(inc, Math.random(), function(inc){
                return function(){
        			client.get(inc, function(val){
        				console.log(inc);
        			});
        		};
            }(inc));
        }
        Ответить
        • Какой-то вообще шизофренический код и в первом и во втором случае...
          Зачем вам нужна переменная key?
          Зачем вы создаете 100 одинаковых функций, два раза?
          Во втором случае еще и зачемто перезаписываете локальное связывание для inc, что делает код более запутанным...

          С виду этот код собирался сделать что-то типа массива на 100 рандомально созданных чисел. Но я не уверен в этом потому что цель достигается каким-то неимоверно сложным способом...
          Ответить
          • Чувак изучает node.js, изучает на синтетическом примере.
            Потому и:
            >Зачем вам нужна переменная key?
            >Зачем вы создаете 100 одинаковых функций
            Во втором случае, вторая функция, нужна для создания замыкания и сохранения переменной inc.
            Ответить
            • > Во втором случае [...]
              Второго случая тоже могло бы не быть, если бы, например, можно было вызвать самую внутреннюю функцию с аргументом inc (почему val не используется?). Но если по каким-то причинам нельзя, то проще сохранить значение в какой-нибудь хеш и использовать одну функцию вместо ста для извлечения значения из хеша. То что здесь происходит, это как забивание гвоздя в стенку передвижением стенки к молотку посредством бульдозера...
              Ответить
              • Ну да. В переделанном примере, имхо, не то обернули в дополнительную функцию. Проще было бы обернуть именно весь кусок с client.set (как я поступил ниже), было бы менее запутанно.

                И еще раз - это синтетический пример, на котором автор разбирается с set и get. В реальности никто set и get в одну функцию упихивать не станет.
                Ответить
          • Очевидно, код записывает в Redis (база даных такая) 100 значений, при завершении каждой записи должен вызываться коллбэк, указанный третьим аргументом к set. Коллбэк, в свою очередь, пытается считать данные обратно, при завершении считывания вызывая другой коллбэк - console.log(inc).
            Видимо, люди учаться работать с Redis, и это один из первых тестов.
            Ответить
          • Ну, видимо, человек просто изучает работу с этим самым redis. Поэтому и взял простой пример - записать число, когда запись закончится - запросить число обратно, когда чтение закончится - вывести результат. Только вот почему он выводит inc а не val - х.з.

            function test(inc) {
                client.set(inc, Math.random(), function() {
                    client.get(inc, function(val) {
                        console.log(inc, val);
                    })
                })
            }
            
            for (var inc=0; i<100; i++)
                test(inc);


            P.S. В который раз убеждаюсь в том, что надо рефрешить страничку, перед тем как писать ответ.
            Ответить
            • Код кстати более понятен для человека не знакомого стонкостями ЖС,
              Единственный момент - каллбак на get принимает два аргумента (err, val)
              client.get(inc, function(err,val) {
                 if(!err)
                     console.log(inc, val);
              })
              Ответить
              • > Код кстати более понятен для человека не знакомого с тонкостями ЖС
                Ну есть такое... в ЖС считаю себя нубом. Ну и просто не люблю вложения коллбеков больше 1-2 уровней... Даже когда писал небольшой проектик c ajax с использованием jQuery, в лямбды выкидывал только совсем тривиальные обработчики, а более сложные - в функции. Привычка, что сказать...

                > Единственный момент - каллбак на get принимает два аргумента (err, val)
                Ну чего не знал, того не знал ;) Переписывал с оригинала.

                P.S. А у set() ошибка не прилетает?
                Ответить
        • Асинхронное программирование js во всей красе.
          Ответить
    • Люди почему-то забывают о Function.prototype.bind. Весь код можно переписать так:
      for (var inc = 0; inc < 100; inc++){
             var key = Math.random();
             client.set(inc, Math.random(), client.get.bind(client, inc, console.log.bind(console, inc)));
      }
      Ответить

    Добавить комментарий