2014-11-19 2 views
-1

Использую функцию для сохранения данных. Использование опции http.request. Он работает нормально. Если я вызываю одну и ту же функцию в цикле, некоторые данные не сохраняются в базе данных. Также получение сообщения об ошибке синтаксического анализа для ответа.Node.js http.request in loop

Как я могу назвать функцию http.request в петле?

for (var i = 1; i <= 23; i++) { 
    turn_timer(i); 
} 

function turn_timer(nos) { 
    try { 
     var str = "num=" + nos; 
     var len = str.length; 

     win_settings.headers = { 
      'Content-length': len, 
      'Content-Type': 'application/x-www-form-urlencoded' 
     } 

     var request = http.request(win_settings, function(response) { 
      response.on('data', function(data) { 

      }); 

      response.on('error', function(err) { 

      }); 

      response.on('end', function() { 

      }); 
     }); 

     request.on('error', function(err) { 

     }); 

     request.write(str + "\0"); 
     request.end(); 

    } catch (err) { 
     console.log(err); 
    } 
} 
+0

вы можете поделиться код? –

+0

Вы прочитали это http://stackoverflow.com/questions/21320159/node-js-sending-http-request-in-a-loop? –

+0

добавил код. он принимает первые пять правильно, а затем следующую 5 ошибок. следующие несколько ok и снова ошибка. это из-за зависания розетки во время ожидания ответа? как это исправить? – swaraj

ответ

0

Проверьте область видимости переменной, которая хранит сообщение, так как вызов функции асинхронного вызова может перезаписать его.

0

Я считаю, что ваша проблема в том, что вы используете цикл for, вместо того, чтобы идти с более асинхронным подходом. Вот краткая попытка решить вашу проблему. Я пропустил часть вашего кода, поскольку он казался неполным. Я оставил важные части и добавил несколько вещей, основанных на ответе на вопрос similar question.

var http = require('http'), 
    async = require('async'); 

function turn_timer(n, callback) { 
    var var str = "num=" + n, 
     len = str.length, 
     req; 

    win_settings.headers = { 
     'Content-length': len, 
     'Content-Type': 'application/x-www-form-urlencoded' 
    }; 

    req = http.request(options, function(response) { 
     ... 
     callback(null); 
    }); 

    req.on('error', function(err) { 
     ... 
     callback(err); 
    }); 

    req.end(); 
} 

async.timesSeries(23, function (n, next) { 
    turn_timer(options, function(err) { 
     next(err); 
    }); 
}); 

Для получения дополнительной информации вы можете прочитать больше о async.timesSeries здесь: https://github.com/caolan/async#timesseriesn-callback

+0

как это будет выполнять ту же функцию с разными значениями? как цикл, ожидающий – swaraj

+0

Он получит номер в качестве первого аргумента. Вы можете использовать это для вычисления любых значений, которые вам нужны. –