0

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

我正在使用异步请求,并且一直在使用 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请求函数完成后,再进行下一部分代码。我如何实现这一目标?

4

1 回答 1

1

这个问题(或其变体)已在 StackOverflow 上被问了 1000 多次。因此,我不打算解释它,但如果您想了解更多信息,您可以在此站点(右上角的搜索输入)上搜索“return async”。

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

对于您的具体情况,您需要更改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..
});
于 2015-05-20T23:55:50.503 回答