NodeJS 等待 HTTP 请求

新手上路,请多包涵

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

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

 var token=getToken();  //After this function has finished
makeRequest(token);   //I want this function to be executed

我怎样才能做到这一点?

原文由 Apatus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 284
2 个回答

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

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

getToken(function(token){
    makeRequest(token);
});

这确保在 getToken 完成之前不会执行 makeRequest。

原文由 Taintedmedialtd 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

您不能创建一个函数来返回一个它没有立即拥有的值。你只能返回一个承诺。

然后在代码的其他部分,您可以使用 then 处理程序等待承诺实现,或者您可以使用类似的东西:

 var token = await getToken();

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

例如,使用 request-promise 模块会是这样的:

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

然后是其他一些功能:

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

或者,使用 async function 是这样的:

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

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

请注意 async functionawait 在 ECMAScript 2017 草案 (ECMA-262) 中定义,该草案截至 2017 年 3 月撰写本文时尚未最终确定(将于 2017 年 6 月完成) ).

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

如果您想要语法略有不同的旧 Node 版本的类似功能,您可以使用 coPromise.coroutine 之类的模块,来自 Bluebird

原文由 rsp 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏