Node.JS / Express - 为什么A-Sync似乎是以随机顺序出现的?

时间:2018-03-15 21:38:32

标签: javascript node.js express

我最近开始使用Node.js / Express。我知道A-Sync通话必须先完成才能继续。在我的代码中,我需要点击三个不同的终点。

由于我已经考虑了A-Sync,因此我尝试对其进行编码,以便按顺序进行编码。

然而,它击中了第一个终点,然后是第三个终点,然后是第二个终点。我知道它必须是我的代码中的一个问题,但我已经在这里工作了几个小时。

我哪里出错了?为什么它会将第二个端点留到最后?

<input matInput [placeholder]=“<any expression>” name="serviceDate" value="
      {{claim.serviceDate | date}}" disabled="disabled">

2 个答案:

答案 0 :(得分:0)

  

我知道A-Sync通话必须先完成才能继续。

事实并非如此。当您发出HTTP请求时,它将发出该请求并继续前进。在您的情况下,它将继续进行下两个HTTP请求。

获得响应后,它将触发相应的callback function。您的回调将按照您获得HTTP请求响应的顺序触发。

这是了解Javascript事件循环的一个很好的链接。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop

希望有所帮助!

PS:如果你想等待一个请求完成,那么我会建议Promises

app.get("/start/:origin/:destination", function ( reqt, resp ) {
    const origin = reqt.params.origin
    const destination = reqt.params.destination
    const url = 'http://localhost:5000/maps/' + origin + '/' + destination
    const totalPrice = 0

    const firstPromise = new Promise((resolve, reject) => {
      http.get(url, res => {
        res.setEncoding('utf8')
        res.on('data', function(body){
          data = JSON.parse(body)
          resolve({
            overallDis: data["distance"],
            aRoadDis: data["ARoads"]
          });
        })
      })
    });

    const secondPromise = new Promise((resolve, reject) => {
      http.get("http://localhost:4000/lowestRate/", res => {
        res.setEncoding('utf8')
        res.on('data', function(body){
          const driver = JSON.parse(body)
          const rate = driver.rate
          console.log(rate)
          resolve(rate);
        })
      })
    });

    Promise.all([firstPromise, secondPromise]).then((values) => {
      // This will fire after both promises have called resolve()
      const overallDis = values[0].overallDis;
      const aRoadDis   = values[0].aRoadDis;
      const rate       = values[1];

      http.get("http://localhost:6000/surge/:" + rate + "/:" + overallDis + "/:" 
        + aRoadDis, res => {
          // console.log(overallDis)
          // console.log(aRoadDis)
          // console.log(rate)
          res.setEncoding('utf8')
          res.on('data', function(body){
            console.log(body)
            totalPrice += parseInt(body)
          })
          console.log(totalPrice)
      })
    });
})

答案 1 :(得分:-1)

正如其他答案中所提到的,你对异步的解释是错误的:同步调用阻止了后续代码的执行,而异步调用却没有。

如果你想按顺序完成操作,但它们实际上是异步的,最简单的方法就是使用回调。这对于较小的调用堆栈是可行的,但它不会被称为callback-hell。

最好的方法是在Promises中包装异步调用,然后使用async / await结构以同步方式对它们进行排序。这可能看起来像这样。

async function (req, res) {
    let op_1_result = await new Promise(function(resolve, reject) {
        ... do your async operation and finally call
        resolve(response);
    });

    ... do your other operations in the same fashion

    let op_n_result = await new Promise(function(resolve, reject) {
        ... do your async operation and finally call
        resolve(response);
    });
    return op_n_result;
}