NodeJS等待HTTP请求

时间:2017-03-09 17:10:02

标签: javascript node.js asynchronous https request

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

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

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

我该怎么做?

4 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:4)

  

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

您无法创建一个返回其不具有的值的函数。你只能回复一个承诺。

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

var token = await getToken();

async function内等待该值可用,但前提是getToken()函数返回一个promise。

例如,使用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版本具有类似功能,则可以使用co中的Promise.coroutineBluebird等模块。

答案 2 :(得分:0)

  

您可以使用javascript Promise或承诺库async

通过javaScript promise:

new Promise((resolve, reject) => {
   resolve(getToken());
}).then(token =>{
    //do you rest of the work
    makeRequest(token);
}).catch(err =>{
   console.error(err)
})

答案 3 :(得分:0)

您可以使用ES6称为生成器的功能。您可以按照此article进行更深入的概念。但基本上你可以使用发电机和承诺来完成这项工作。我使用bluebird来宣传和管理生成器。

您的代码应该像下面的示例一样好。

const Promise = require('bluebird');

function getToken(){
  return new Promise(resolve=>{
           //Do request do get the token, then call resolve(token).
         })
}

function makeRequest(token){
   return new Promise(resolve=>{
     //Do request do get whatever you whant passing the token, then call resolve(result).
   })
}

function* doAsyncLikeSync(){
  const token= yield getToken();  //After this function has finished
  const result = yield makeRequest(token);   //I want this function to be executed
  return result;
}

Promise.coroutine(doAsyncLikeSync)()
  .then(result => {
    //Do something with the result
  })