我最近开始使用Node.js / Express。我知道A-Sync通话必须先完成才能继续。在我的代码中,我需要点击三个不同的终点。
由于我已经考虑了A-Sync,因此我尝试对其进行编码,以便按顺序进行编码。
然而,它击中了第一个终点,然后是第三个终点,然后是第二个终点。我知道它必须是我的代码中的一个问题,但我已经在这里工作了几个小时。
我哪里出错了?为什么它会将第二个端点留到最后?
<input matInput [placeholder]=“<any expression>” name="serviceDate" value="
{{claim.serviceDate | date}}" disabled="disabled">
答案 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;
}