2013-05-30 41 views
0

我知道这可能是异步JavaScript 101,我确实有一些关于Kindle的书籍,我可以咨询一下,但是我并不在我的设备附近。使用node.js如何将var设置为HTTP客户端的响应?

我有一个节点应用程序,其变量被分配给我加载的模块。该模块有一个功能可以从URL下载一串数据。

问题是,在请求返回之前如何不设置变量?

我的代码如下所示:

Downloader.js:

var http = require('http'); 
exports.downloadString = function(str) { 
    console.log("Downloading from " + str); 
    http.get(str, function(res) { 
    var data = []; 
    console.log("Got response: " + res.statusCode); 
    res.on('data', function (chunk) { 
     data.push(chunk); 
    }); 
    res.on('end', function() { 
     return data.join(''); 
    }); 
    }).on('error', function(e) { 
    console.log("Got error: " + e.message); 
    }); 
} 

app.js:

var downloader = require('./lib/Downloader') 
, dateParser = require('./lib/DateParser') 
, eventIdGenerator = require('./lib/EventIdGenerator'); 

var report = downloader.downloadString("http://exampleapi.com"); 

console.log(report); 

我需要等待填充名为 “报告” 的变量,直到。

显然这意味着我的摩卡测试也失败了,因为我仍然不确定如何告诉测试等待变量填充。

我相信这是非常简单的,但我画空白!

谢谢!

+0

您不能从AJAX呼叫返回。它是异步的。您需要在回调中执行您的操作(或传递回调函数)。 –

回答

3

Node.js的是(主要)是异步的,所以你需要一个回调函数传递给你的模块:

Downloader.js:

var http = require('http'); 
exports.downloadString = function(str, callback) { 
    console.log("Downloading from " + str); 
    http.get(str, function(res) { 
    var data = []; 
    console.log("Got response: " + res.statusCode); 
    res.on('data', function (chunk) { 
     data.push(chunk); 
    }); 
    res.on('end', function() { 
     callback(data.join('')); 
    }); 
    }).on('error', function(e) { 
    console.log("Got error: " + e.message); 
    }); 
}; 

app.js:

var downloader = require('./lib/Downloader') 
, dateParser = require('./lib/DateParser') 
, eventIdGenerator = require('./lib/EventIdGenerator'); 

downloader.downloadString("http://exampleapi.com", function(report) { 
    console.log(report); 
}); 
+0

是的!这非常有意义。谢谢! –

相关问题