首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node.JS/Express -为什么a看起来是随机的呢?

Node.JS/Express -为什么a看起来是随机的呢?
EN

Stack Overflow用户
提问于 2018-03-15 21:38:31
回答 2查看 93关注 0票数 0

我最近开始使用Node.js/Express。我知道an呼叫必须完成才能继续。在我的代码中,有三个不同的端点需要点击。

由于我已经考虑到了As,所以我尝试对其进行编码,这样它就可以按照它们的显示顺序进行编码。

然而,它到达了第一个终点,然后是第三个,然后是第二个。我知道这一定是我的代码中的一个问题,但是我已经做了好几个小时了。

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

代码语言:javascript
运行
复制
app.get("/start/:origin/:destination", function ( reqt, resp ) {
var origin = reqt.params.origin
var destination = reqt.params.destination
var url = 'http://localhost:5000/maps/' + origin + '/' + destination 

var rate;
var overallDis;
var aRoadDis;

var data;
http.get(url, res => {
    res.setEncoding('utf8')
    res.on('data', function(body){
        data = JSON.parse(body)
        overallDis = data["distance"]
        aRoadDis = data["ARoads"]
    })
})

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

})

var totalPrice = 0
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)
})

})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-15 21:44:10

我知道an呼叫必须完成才能继续。

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

在得到响应后,它将触发相应的回调函数。您的回调将按您对HTTP请求的响应顺序触发。

这里有一个很好的链接来学习Javascript事件循环。https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop

希望这能帮上忙!

PS:如果你想等待一个请求完成,然后再转到剩下的,我建议应许

代码语言:javascript
运行
复制
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)
      })
    });
})
票数 0
EN

Stack Overflow用户

发布于 2018-03-15 22:00:42

正如在其他答案中提到的,您对异步的解释是错误的:同步调用会阻止以下代码的执行,而异步调用则不会。

如果您想按顺序进行操作,但它们实际上是异步的,最简单的方法是使用回调。这对于较小的调用堆栈来说是可行的,但它不是所谓的回调--无意义的地狱。

最好的方法是将异步调用封装在承诺中,然后使用异步/等待结构以同步方式对它们进行排序。这可能看起来像这样。

代码语言:javascript
运行
复制
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;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49309676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档