NodeJS等待HTTP请求

Apa*_*tus 3 javascript https asynchronous request node.js

我想编写一个从API请求令牌的应用程序。只要此令牌不可用,我就不想继续应用程序的其余部分。因此,它必须像同步HTTP请求一样。

我的目标是创建一个执行请求的函数,然后返回令牌,例如:

var token=getToken();  //After this function has finished
makeRequest(token);   //I want this function to be executed
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Tai*_*ltd 7

它根本不想同步。拥抱回调的力量:

function getToken(callback) {
    //get the token here
    callback(token);
};

getToken(function(token){
    makeRequest(token);
});
Run Code Online (Sandbox Code Playgroud)

这样可以确保在getToken完成之前不执行makeRequest。

  • 那么这意味着在回调函数中我的整个代码必须被执行? (2认同)

rsp*_*rsp 5

我的目标是创建一个执行请求的函数,然后返回令牌

您不能使函数返回没有立即返回的值。您只能退还诺言。

然后在代码的其他部分,您可以使用then处理程序来等待诺言的实现,或者可以使用类似以下内容的代码:

var token = await getToken();
Run Code Online (Sandbox Code Playgroud)

异步函数内部以等待该值可用,但前提是该getToken()函数返回一个Promise。

例如,使用该request-promise模块将类似于:

var rp = require('request-promise');
function getToken() {
    // this returns a promise:
    return rp('http://www.example.com/some/path');
})
Run Code Online (Sandbox Code Playgroud)

然后是其他一些功能:

function otherFunction() {
    getToken().then(token => {
        // you have your token here
    }).catch(err => {
        // you have some error
    });
}
Run Code Online (Sandbox Code Playgroud)

或者,async function像这样:

async function someFunction() {
    try {
        var token = await getToken();
        // you have your token here
    } catch (err) {
        // you have some error
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅:https//www.npmjs.com/package/request-promise

请注意,async function并且await是在ECMAScript 2017草案(ECMA-262)中定义的,在撰写本文时(截至2017年3月),该草案尚未定稿(将于2017年6月发布)。

但自v7.6起,它已在Node中可用(如果使用该--harmony标志,则自v7.0起已可用)。有关与Node版本的兼容性,请参见:

如果你想为老年人节点版本略有不同的语法类似的功能,你可以像使用模块共同Promise.coroutine蓝鸟