我最近开始使用Node.js/Express。我知道an呼叫必须完成才能继续。在我的代码中,有三个不同的端点需要点击。
由于我已经考虑到了As,所以我尝试对其进行编码,这样它就可以按照它们的显示顺序进行编码。
然而,它到达了第一个终点,然后是第三个,然后是第二个。我知道这一定是我的代码中的一个问题,但是我已经做了好几个小时了。
我哪里出错了?为什么把第二个端点留到最后?
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)
})
})
发布于 2018-03-15 21:44:10
我知道an呼叫必须完成才能继续。
事实上,情况并非如此。当您发出HTTP请求时,它将发出该请求并继续前进。在您的示例中,它将继续发出接下来的两个HTTP请求。
在得到响应后,它将触发相应的回调函数。您的回调将按您对HTTP请求的响应顺序触发。
这里有一个很好的链接来学习Javascript事件循环。https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
希望这能帮上忙!
PS:如果你想等待一个请求完成,然后再转到剩下的,我建议应许。
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)
})
});
})
发布于 2018-03-15 22:00:42
正如在其他答案中提到的,您对异步的解释是错误的:同步调用会阻止以下代码的执行,而异步调用则不会。
如果您想按顺序进行操作,但它们实际上是异步的,最简单的方法是使用回调。这对于较小的调用堆栈来说是可行的,但它不是所谓的回调--无意义的地狱。
最好的方法是将异步调用封装在承诺中,然后使用异步/等待结构以同步方式对它们进行排序。这可能看起来像这样。
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;
}
https://stackoverflow.com/questions/49309676
复制相似问题