如何处理节点http请求

How to handle node http requests

我正在尝试了解如何在节点中等待 http 请求完成。我想发出两个 http 请求并在 http 请求完成后调用的函数中使用结果。

我正在使用 asyncrequest 并且一直在使用 async.series 如下:

var request = require("request");
var express = require('express');
var async = require("async");

app.get('/rx', function(req, res) {
    var drug1 = req.query.drug1;
    var drug2 = req.query.drug2;
    console.log("in rx")
    console.log(drug1);
    console.log(drug2);
    var id1 = '';
    var id2 = '';

    /*part of code I'm concerned with*/
    async.series([
            function(callback) {
                id1 = getID(drug1);
                console.log("function one");
                console.log(id1);
                callback();
            },
            function(callback) {
                id2 = getID(drug2);
                console.log("function two");
                console.log(id2);
                callback();
            }
        ],
        function(err, results) {
            console.log(id1);
            console.log(id2);
            request("http://rxnav.nlm.nih.gov/REST/interaction/interaction.json?list?rxcuis=" + id1 + "&sources=" + id2, function(error, response, body) {
                console.log("finished!");
                res.json(body);
            });
        });
});

//returns an int ID
function getID(drugName) {
    request("http://rxnav.nlm.nih.gov/REST/Prescribe/rxcui.json?name=" + drugName, function(error, response, body) {
        var content = JSON.parse(body);
        var id = parseInt(content.idGroup.rxnormId);
        console.log("in getID function");
        console.log(id);
        return id;
    });
}

控制台输出显示:

in rx
advil
ibuprofen
seriesone
undefined
two
undefined
undefined
undefined
finished!

GET /rx?drug1=advil&drug2=ibuprofen 304 345ms
in getID function
153010
in getID function
5640

我想等到每个http请求函数完成后,再进行下一段代码。我该如何实现?

此问题(或其变体)已在 Whosebug 上被问过 1000 多次。所以我不打算解释它,但如果你想了解更多,你可以在这个网站上搜索"return async"(右上角的搜索输入)。

基本问题是不可能 return 来自异步函数的值(有没有想过为什么他们接受回调?)。

对于您的具体情况,您需要将 getId() 更改为:

//returns an int ID
function getID(drugName, callback) {
    request("http://rxnav.nlm.nih.gov/REST/Prescribe/rxcui.json?name=" + drugName, function(error, response, body) {
        var content = JSON.parse(body);
        var id = parseInt(content.idGroup.rxnormId);
        console.log("in getID function");
        console.log(id);
        callback(null,id); // <--- this is how you return async values
    });
}

注意:null 是因为 async.js 系列中的函数期望回调的第一个参数是错误的。所以如果没有错误通过null。顺便说一句,这是标准的 node.js 做法。

然后在 async.series() 里面你做:

async.series([
    function(callback) {
        getID(drug1,callback);
    },
    function(callback) {
        getID(drug2,callback);
    }
],
function(err, results) {
    console.log(results[0]); // id1
    console.log(results[1]); // id2

    // do the rest..
});