当1使http GET

时间:2019-06-26 15:28:13

标签: node.js promise

我正在尝试进行几个函数调用,这些函数将汇总信息,然后对该信息进行操作。有些调用会发出HTTP请求,这很慢。其他人则快得多。

我所有的函数调用都能正常工作并构建必要的数据,但是在继续前进之前,我需要等待HTTP请求。

我尝试了promises,async / await等。

const http = require('http');

async function operation() {
    return new Promise(function(resolve, reject) {
      const url = 'http://www.google.com';
      http.get(url, (resp) => {
        let data = '';
        resp.on('data', (chunk) => {
          data += chunk;
        });
        resp.on('end', () => {
          resolve(resp.statusCode);
        });
      }).on("error", (err) => {
        reject(err);
      });
    })
}

async function app() {
    var a = await operation()
    console.log('a: ', a) // this returns 200
}

function test() {
  console.log('test: ','THIS SHOULD COME AFTER')
}


app()
test()

我需要test函数的结果紧随app之后。我看到200之前印有“此后应该出现”的字样

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,app是一个异步函数,而测试是同步的。这意味着,如果您致电app(); test();test将始终在app解析之前完成。但是,请记住,Promises最终将resolvereject

这意味着,要在异步之后调用同步函数,则需要在test中调用app,如下所示:

async function app() {
  //add try-catch to handle rejection of promise
  try {
    var a = await operation()
    console.log('a: ', a) // this returns 200
    // now you can call test after app
    test();
  } catch (err) {
    //handle error case to trigger rejection of promise
    throw new Error(err)
  }
}

或者记住Promisesthenable

app()
.then(someReturnedValue => test())
.catch(err => /*handle errors*/)

您在注释中提到了几个类似app的函数,这些函数将在test之前聚合。您可以考虑使用Promise.all,它接收Promises的数组,并将返回与每个已解决的Promise对应的数据数组,或者在任何Promises拒绝时捕获错误。

Promise.all([app, app1, app2])
.then(arrayOfReturnedValues => test())
.catch(err => /*handle errors*/)