Javascript 使用Node.js将http post请求的异步响应获取到变量中

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

我对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 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.request
    发送了http请求
  • 它马上就回来了
  • 不知何故,稍后,
    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请求期间冻结。这意味着其他任务计划的任务将不会按时调用。哟