ЙажаСценарий / Говнокод #11462 Ссылка на оригинал

0

  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 возвращается?"
Спросил у меня утром знакомый и отправил этот код.

Запостил: хуита хуита, (Updated )

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

  • Откуда пытливый читатель может знать, что такое 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() ошибка не прилетает?
              Ответить
  • Люди почему-то забывают о 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)));
    }
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8