2016-01-19 16 views
8

Mam problem z jakimś kodem NON PRODUKCJI. Chcę przetworzyć około 3000 elementów tablicy. Jeśli przejdę do procesu węzła, to jest on ustawiony na epoll_wait(5, więc prawdopodobnie blokuję główny wątek.Dlaczego ta funkcja myFunction(). Then() wydaje się zawieszać w nieskończoność?

Czy ktoś może sugerować: a) co robię źle lub b) jak mogę spojrzeć na pętlę stosu realizacji/zdarzenia, aby dokładnie sprawdzić, dlaczego kod zwisa? Próbowałem debugować i przechodzić przez kod i proces ten działał, ale nie jestem mądrzejszy.

zaktualizowanego kodu przy użyciu Promises.map:

connection.query(firstPostQuery,{ x: whiteListString }, function(err, rows) { 

    Promise.map(rows, function(result) { 


     return sfs.isSpammer({ 
      ip: result.ip, 
      email: result.email, 
      username: result.poster 
     }).then(function(res) { 
console.log(parseInt(res.username.appears) == 1); //evaluates to true 

      if (parseInt(res.username.appears) == 1) { 

       console.log(res.toJSON()); 
       fs.appendFile(__dirname + '/stopforumspam.txt', res.poster + '\n', 
        function(err) { 
         if (err) { 
          throw err; 
         } 
         return true; 
        }); 

      } else { 
       fs.appendFile(__dirname + '/stopforumspam.txt', 
        'nope\n', 
        function(err) { 
         if (err) { 
          throw err; 
         } 
         return true; 
        }); 
      } 
     }); 
     //Iteration completed 
    }, {concurrency: 5}).then(function(result) { 
     //Do something with result 
     console.log(result); 
    }).catch(function(err) { 
     //Error 
    }); 
}); 

biegnę przed node.js 4.2.4. Eksperymentowałem z obietnicami Bluebird, ale nie jestem pewien, czy byłoby to przydatne w tym przypadku, ponieważ nie w pełni rozumiem obietnice (jeszcze).

+0

Robisz wszystkie 3000 wniosków na raz, więc może to tylko, że cokolwiek maszyna/usługa żądasz jest zajęty do przetwarzania wszystkie te wnioski czy to może być, że usługa nie może obsłużyć SFS 3000 i wnioski zawiesza się. – slebetman

+0

@leblebet dzięki. Jak podchodziłbyś do spowalniania tego i składania wniosków w małych partiach? Próbowałem już różnych bibliotek, które twierdzą, że to robią, ale też nie rozwiązały problemu. – codecowboy

+0

@ codecowboy, właściwie, mieszałeś synchronizację. pętla, z obietnicami, dlatego masz usterki. –

Odpowiedz

1

Możesz spróbować użyć (bluebird) Promise.map do iteracji asynchronicznej.

connection.query(firstPostQuery, {x: whiteListString}, function(err, rows) { 

    Promise.map(rows, function(result, index) { 
     console.log('item', index); 
     return new Promise(function(resolve, reject) { 
      sfs.isSpammer({ 
       ip: result.ip, 
       email: result.email, 
       username: result.poster 
      }).then(function(res) { 
       console.log('In Promise', res); 
       console.log(parseInt(res.username.appears) == 1); //evaluates to 
                    // true 
       if (res && parseInt(res.username.appears) == 1) { 
        return fs.appendFile(__dirname + '/stopforumspam.txt', res.poster + '\n', 
          function(err) { 
           console.log('In AppendFile spamer'); 
           if (err) { 
            reject(err); 
           } 
           resolve(true); 
          }); 
       } else { 
        return fs.appendFile(__dirname + '/stopforumspam.txt', 
          'nope\n', 
          function(err) { 
           console.log('In AppendFile good user'); 
           if (err) { 
            reject(err); 
           } 
           resolve(true); 
          }); 
       } 
      }); 
     }); 
    }).then(function(res) { 
     console.log(res); 
    }).catch(function(err) { 
     console.log(err); 
    }); 
}); 
+0

dzięki. Dodałem trochę zaktualizowanego kodu do mojego pytania. Jednak kod po '' 'if (parseInt (res.username.appears) == 1)' '' nie działa, tzn. Nic nie jest zapisywane do mojego pliku. Czy to możliwe, że jest to spowodowane architekturą biblioteki stopforumspam? https://github.com/deltreey/stopforumspam – codecowboy

+0

Nie, wszystko jest ok z biblioteką, właśnie zapomniałem zawinąć fs.appendFile (ponieważ jest to asynchroniczna funkcja) z Obietnicą, odpowiedź zaktualizowana. Powinno być teraz ok, z prawidłową kolejnością wykonania; –

+0

@ codecowboy, prosty test, do demonstracji https://jsfiddle.net/4dmdnx24/ –

Powiązane problemy