2013-12-16 15 views
1

Я пытаюсь получить ответ, полученный от сервера, в том же порядке, что и URL-адреса передавались как аргументы командной строки. Но он не выполняет синхронизацию, пожалуйста, помогите. Я относительно новичок в javascript и узле. пожалуйста найти мой код ниже:Выполнение синхронизации Получить запрос с использованием Node.js

var http = require('http'); 
var bl = require('bl'); 
var fs = require('fs'); 
var q = []; 
var count = 0; 
q[0] = getRequest(process.argv[2]); 
q[1] = getRequest(process.argv[3]); 
q[2] = getRequest(process.argv[4]); 
function getRequest(url) { 
    var val; 
    http.get(url,function (res) { 
     res.on('end', function() { 
      count++; 
     }), 
      res.pipe(bl(function (error, data) { 
       val = data.toString(); 
       if (error) { 
        console.log(error); 
       } 
       else { 
        console.log(val); 
       } 
      })) 
    }).on('error', function (e) { 
      console.log("Got error: " + e.message); 
     }); 
    return val; 
} 

if (count == 3) { 
    for (var i = 0; i < q.length; i++) { 
     console.log[q[i]]; 
    } 
} 
+0

как только вы знакомы с async Node.js: http://stackoverflow.com/questions/16336367/what-is-the-difference-between-synchronous-and-asynchronous-programming-in-node, вы можете использовать https : //github.com/caolan/async, чтобы сделать код более понятным и понятным. – TheBronx

+0

Я бы попробовал рекурсивный подход здесь: http://stackoverflow.com/a/6048595/2063246 (он отлично работал для меня!) – Halogen

ответ

3
var http = require('http'); 
var bl = require('bl'); 

// data should return via callback = function(err, data) 
function getRequest(url, callback) { 
    http.get(url, function(res) { 
     res.pipe(bl(function(error, data) { 
      callback(error, data); 
     })) 
    }).on('error', function(e) { 
     callback(error); 
    }); 
} 

// npm install async 
var async = require('async'); 

async.map(process.argv.slice(2), getRequest, function (err, data_array) { 
    data_array.forEach(function (data, i) { 
     console.log(i, data.toString('utf8')); 

    }); 
}) 

сохранить как test.js и бега от терминала:

npm install bl 
npm install async 
node test.js http://api.openkeyval.org/hello1 http://api.openkeyval.org/hello2 

выход:

0 'hello one' 
1 'hello two' 

async.map будем называть вательно GetRequest так:

getRequest(url1, function (e, data) { 
    console.log(data); 
    getRequest(url2, function (e, data) { 
     console.log(data); 
     getRequest(url3, function (e, data) { 
      console.log(data); 
     }) 
    }); 
}); 
+1

и это не синхронизация мысли – damphat

+0

Спасибо Damphat. Я попробовал ваш метод 1, но он не сработал. хотя второй метод работал! но так как u сказал, что его «не синхронизированная мысль» – Ankit

+0

просто опечатка ')', она должна работать без изменений :) – damphat

1

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

 res.pipe(bl(function (error, data) { 
      val = data.toString(); 
      q.push(val); 
      if (error) { 
      ... 

Или, если вы хотите использовать счет, вы можете сделать:

 res.pipe(bl(function (error, data) { 
      val = data.toString(); 
      q[count] = val; 
      if (error) { 
      ... 

Тогда вы можете просто позвонить:

getRequest(process.argv[2]); 
getRequest(process.argv[3]); 
getRequest(process.argv[4]); 
+0

Спасибо за ответ. Я пробовал это, но он не работает! – Ankit

+0

@Ankit Можете ли вы сказать, что не сработало. – user568109

+0

после использования метода, предоставленного вами, я все еще получаю асинхронный ответ. – Ankit

1

Другой подход к нему, без использования каких-либо плагинов или дополнений для реализации асинхронной:

var http = require('http') 
var bl = require('bl') 
var results = [] 
var count = 0 

function printResults() { 
    for (var i = 0; i < 3; i++) 
     console.log(results[i]) 
} 

function httpGet (index) { 
    http.get(process.argv[2 + index], function (response) { 
     response.pipe(bl(function (err, data) { 
      if (err) 
       return console.error(data) 

      results[index] = data.toString() 
      count++ 

      if (count == 3) // yay! we are the last one! 
       printResults() 
     })) 
    }) 
} 

for (var i = 0; i < 3; i++) 
    httpGet(i) 

или без каких-либо надстроек или плагинов

var http = require('http') 
//var bl = require('bl') // if you want to use bl 

var url1 = process.argv[2] 
var url2 = process.argv[3] 
var url3 = process.argv[4] 

// data should return via callback = function(err, data) 
function getRequest(url, callback) { 

    http.get(url, function(response) { 

     response.setEncoding('utf8') 

     response.on('error', function(e) { 
      callback(error); 
     }) 

     var allData = '' 
     response.on('data', function(data) { 
      allData += data 
     }) 

     response.on('end', function() { 
      callback(null, allData) 
     }) 

     // Would be the result using bl 
     /* 
     response.pipe(bl(function(err, data) { 
      callback(err, data.toString()) 
     })) 
     */ 

    }) 

} 

// This can be placed in a for loop 
getRequest(url1, function (e, data) { 
    console.log(data) 
    getRequest(url2, function (e, data) { 
     console.log(data) 
     getRequest(url3, function (e, data) { 
      console.log(data) 
     }) 
    }) 
}) 

Так что вы не были так далеко с первой попытки!

Смежные вопросы