在Node中同步请求调用

时间:2014-12-05 05:44:03

标签: node.js

我正在使用标准的“请求”模块

https://www.npmjs.org/package/request

我想知道 - 如果我有两个连续/顺序请求调用,那么:

request.post({...});`  //first request

request.get({...});` //second request

...如何进行同步,以便第一个请求在第二个请求被调用之前总是完成(第一个请求是身份验证,所以肯定需要先发生)。

我知道如何做到这一点的唯一方法是将它们嵌套起来:

 request.post({
    url: teamsnapURL,
    json: {
        user: "the1mills@yahoo.com",
        password: "******"
    }
}, function (err, res, body) {
    if (err) {
        throw err;
    }
    teamSnapToken = res.headers['x-teamsnap-token'];

    request.get({
        url: 'https://api.teamsnap.com/v2/teams',
        json: {
        },
        headers: {
            'x-teamsnap-token':teamSnapToken
        }
    }, function (err, res, body) {
        if (err) {
            throw err;
        }
        else{
            console.log('body:',body)
        }

})
});

还有另一种方法吗?

一种方法是使用节点约定来传递回调函数“next”,并在验证工作时调用它,否则抛出错误。我会看看我是否可以解决这个问题并将其作为答案添加(这个问题不只有一个答案)。

这是非嵌套回调方式,通过将函数作为参数传递解决。这似乎是避免重度嵌套函数调用的标准。

var request = require('request');
var teamsnapURL = 'https://api.teamsnap.com/v2/authentication/login';

var teamSnapToken = null;

var makeGetRequest = function(){

    request.get({
        url: 'https://api.teamsnap.com/v2/teams',
        json: {

        },
        headers: {
            'x-teamsnap-token':teamSnapToken
        }
    }, function (err, res, body) {
        if (err) {
            throw err;
        }
        else{
            console.log('body:',body)
        }

    });

};

var authPost = function(makeGetRequest){

    request.post({
        url: teamsnapURL,
        json: {

            user: "the1mills@yahoo.com",
            password: "*******"
        }
    }, function (err, res, body) {
        if (err) {
            throw err;
        }
        teamSnapToken = res.headers['x-teamsnap-token'];
        makeGetRequest();

})};

authPost(makeGetRequest);

虽然我不得不说,这似乎只是使用函数作为对象的一个​​愚蠢的借口,因为两个函数都在同一个文件中,所以你可以通过名称调用另一个函数而不将它嵌套或传入as一个参数,whatevs。

1 个答案:

答案 0 :(得分:2)

几乎就是这样 - 你知道请求已经完成就是回调触发了,所以如果你在第一个请求完成后必须发生一些事情,你必须在回调中进行。

有一些方法可以让这看起来更容易,但它基本上仍然是一样的。例如,使用async库,如下所示:

async.waterfall([
    function (done) {
        request.post(firstRequest, function (err, res, body) { done(err, res, body); });
    },
    function (done, res, body) {
        teamSnapToken = res.headers[...];
        request.get(second-request, function (err, res, body) { done(err, res, body); });
    }
    ],
    function (err, result) {
        // final callback here
    });
相关问题