Javascript 使用Node.js将http post请求的异步响应获取到变量中
我对Javascript还很陌生,我正试图了解Javascript的异步性概念 我的目标是,Javascript 使用Node.js将http post请求的异步响应获取到变量中,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我对Javascript还很陌生,我正试图了解Javascript的异步性概念 我的目标是, responseStr = httpPost(parameters) // then store responseStr in DB 但是,我能做的Javascript是 var callback = function(response) { var str = ''; //another chunk of data has been recieved, so append it t
responseStr = httpPost(parameters)
// then store responseStr in DB
但是,我能做的Javascript是
var callback = function(response) {
var str = '';
//another chunk of data has been recieved, so append it to `str`
response.on('data', function(chunk) {
str += chunk;
});
//the whole response has been recieved, so we just print it out here
response.on('end', function() {
console.log(str);
});
};
http.request(options, callback).end();
因此,我将http post请求的响应从上面的代码中放入局部变量str
,但我仍然无法想象如何将其传递回调用方httpPost
进入responseStr
基本上,流程是
- 在我的
函数中,我通过httpPost
发送了http请求http.request
- 它马上就回来了
- 不知何故,稍后,
函数逐位填充callback
变量str
httpPost
调用者到responsest
,以便我可以存储它?Thx
摘要:
谢谢所有回答的人。我非常喜欢你们所有人的幽默感,我投票给你们所有人
PS.分享,关于Javascript的异步性
今天,我们将在node.js中研究异步执行相同任务的四种不同方法:
:-)如果要在获取数据后存储所有数据,可以将其添加到嵌套函数中,如下所示
var callback = function(response) {
var str = '';
//another chunk of data has been recieved, so append it to `str`
response.on('data', function(chunk) {
str += chunk;
});
//the whole response has been recieved, so we just print it out here
response.on('end', function() {
console.log(str);
responseStr = httpPost(parameters); //this line should be added here
});
};
http.request(options, callback).end();
如果要在获取数据后存储所有数据,可以将其添加到嵌套函数中,如下所示
var callback = function(response) {
var str = '';
//another chunk of data has been recieved, so append it to `str`
response.on('data', function(chunk) {
str += chunk;
});
//the whole response has been recieved, so we just print it out here
response.on('end', function() {
console.log(str);
responseStr = httpPost(parameters); //this line should be added here
});
};
http.request(options, callback).end();
您尝试做的事情有几个问题。第一个问题是,不可能从非阻塞函数返回一个仅在将来可用的值。不过,别担心,一旦时间旅行成为可能,我们就再也不用担心这个问题了:)但在那之前,我们该从这里走到哪里?我们可以做一些事情来获得价值 第一个(首选)解决方案是修改程序,只需将使用该值的所有功能移动到该值可用的位置,例如回调。例如,假设唯一使用value的功能是函数调用
do\u stuff\u with(value)
通常我从新程序员那里得到的回应是“哦,不!这意味着我需要改变我的整个程序!我们还有什么可以做的吗?我不想改变代码。它很完美,现在是我家庭的一部分。你这个怪物!”我必须承认,这正是我被提出同样的解决方案后的感受。对于这个问题,您可能希望立即使用另一种解决方案,但它将极大地影响程序的性能
第二个(糟糕、幼稚,你会后悔的,不要这样做)解决方案成功地从函数调用返回值,要求你使用支持同步功能的方法。我只在javascript以外的所有语言中看到同步代码,因为javascript是单线程的。“亵渎,这到底是什么意思?”这意味着整个javascript程序需要暂停整个过程,以等待http请求完成。如果不打开新线程,则无法打开http请求。那么糟糕吗?是的。这意味着整个用户界面将在http请求期间冻结。这意味着其他任务计划的任务将不会按时调用。你知道玩一个一直冻结的电子游戏是什么感觉。太可怕了
“但是我没有想象力,我真的想写一个糟糕的程序。”-好吧,只需修改你的程序,使用一个实现同步功能的方法,而不是一个接受回调的异步方法。我不知道从哪里得到这个,因为我从来都不需要它
// replace this method
var value = get_str_async_method('param', callback);
console.log(value) // undefined
// use one that is synchronous
// a callback is not needed for this method
var value = get_str_sync_method('param');
console.log(value); // reponse
您尝试做的事情有几个问题。第一个问题是,不可能从非阻塞函数返回一个仅在将来可用的值。不过,别担心,一旦时间旅行成为可能,我们就再也不用担心这个问题了:)但在那之前,我们该从这里走到哪里?我们可以做一些事情来获得价值 第一个(首选)解决方案是修改程序,只需将使用该值的所有功能移动到该值可用的位置,例如回调。例如,假设唯一使用value的功能是函数调用
do\u stuff\u with(value)
通常我从新程序员那里得到的回应是“哦,不!这意味着我需要改变我的整个程序!我们还有什么可以做的吗?我不想改变代码。它很完美,现在是我家庭的一部分。你这个怪物!”我必须承认,这正是我被提出同样的解决方案后的感受。对于这个问题,您可能希望立即使用另一种解决方案,但它将极大地影响程序的性能
第二个(糟糕、幼稚,你会后悔的,不要这样做)解决方案成功地从函数调用返回值,要求你使用支持同步功能的方法。我只在javascript以外的所有语言中看到同步代码,因为javascript是单线程的。“亵渎,这到底是什么意思?”这意味着整个javascript程序需要暂停整个过程,以等待http请求完成。如果不打开新线程,则无法打开http请求。那么糟糕吗?是的。这意味着整个用户界面将在http请求期间冻结。这意味着其他任务计划的任务将不会按时调用。哟