Node.js 节点-基于第一个http.request的结果回调第二个http.request

Node.js 节点-基于第一个http.request的结果回调第二个http.request,node.js,xmlhttprequest,Node.js,Xmlhttprequest,我正在用NodeJs中的http.request调用一个API 调用的目的是在外部服务上创建一个新项。为此,需要提供一个标签参数。如果成功,则返回状态代码200和JSON格式的新创建项。但是,如果该项已经存在,则返回404。获取该项需要调用其他方法 以下是我是如何实现它的: function logError(err) { console.log(err) } function doSomething(chunk) { console.log(chunk) } if (var

我正在用NodeJs中的http.request调用一个API

调用的目的是在外部服务上创建一个新项。为此,需要提供一个
标签
参数。如果成功,则返回状态代码200和JSON格式的新创建项。但是,如果该项已经存在,则返回404。获取该项需要调用其他方法

以下是我是如何实现它的:

function logError(err) {
    console.log(err)
}

function doSomething(chunk) {
    console.log(chunk)
}

if (var == true) {

    var domain = 'domain',
        port = 80,
        pathNew = '/api/v2/new?label=' + label + '&api_key=' + process.env.API_KEY,
        pathGet = '/api/v2/get?label=' + label + '&api_key=' + process.env.API_KEY,
        method = 'GET';         

    http.request({
        host: domain,
        port: port,
        path: pathNew,
        method: method
    }, function(res) {

        res.setEncoding('utf8');

        if( res.statusCode == '404') {

            http.request({
                host: domain,
                port: port,
                path: pathGet,
                method: method
            }, function(res2) {

                res2.setEncoding('utf8');

                res2.on('data', doSomething);

            }).on('error', logError).end();

        }

        res.on('data', doSomething);

    }).on('error', logError).end();             

我意识到这可能不是最好的方法。我如何才能以更精简的方式完成这项工作?

这甚至不会像您现有的方式那样工作。您必须更改
res2.on('data',doSomething(chunk))
res2.on('data',doSomething)
和其他
.on()
处理程序也是如此。显示的方式立即调用函数,而不是传递稍后可以调用的函数引用。另外,
consol.log(chunk)
应该是
console.log(chunk)
仍然需要帮助:)这是正确的常规方法。您是否有需要帮助的具体问题?该模块可能会使这一点稍微容易一些。我认为可能有更好的方法来做到这一点,而不必去回调地狱,也许通过
async
在一个回调中嵌入第二个操作很难说是回调地狱。您可以使用承诺或类似async的库来链接或排序异步操作。要使用承诺,您必须首先“承诺”您正在使用的接口,以便可以使用承诺。一旦得到许可,您可以使用
request(…)。然后(函数(第一个)返回request(…)它在回调中仍然有第二个操作(承诺仍然是回调),但它稍微简化了一点。