等待火力基地响应,然后再继续循环



我正在构建一个像 uber 这样的应用程序,我想一个接一个地向数据库中的司机发送行程请求,并等待司机的响应,然后再将请求发送给下一个司机(如果行程被拒绝(或结束循环(如果行程被接受(。

我尝试在从数据库获取的所有驱动程序上使用 for 循环并发送请求然后侦听,但它没有给出预期的结果。相反,它会将请求发送给所有驱动程序。

sendTripRequest(request){
this.rejecters = [];
// var i = 0;
// var inProgress = false;
Object.keys(this.allDrivers).forEach((key)=>{
// put all drivers into an array
this.allDriversAray.push(this.allDrivers[key])
})
// sort all drivers by distance and put in another array
this.sortedDriversAray = this.applyHaversine(this.allDriversAray,request.originLat,request.originLng);
this.sortedDriversAray.sort((locationA,locationB)=>{
return locationA.distance - locationB.distance;
});
// send request to drivers starting from closest
return new Promise((resolve,reject)=>{
console.log('sorted array is ');
console.log(this.sortedDriversAray);
for(let i = 0;i<this.sortedDriversAray.length;i++){  
console.log('handling driver: '+this.sortedDriversAray[i].id);
// while(inProgress);  
// inProgress = true;   
if(this.sortedDriversAray[i].availability === true && this.rejecters.indexOf(this.sortedDriversAray[i]) <= -1 && this.sortedDriversAray[i].request == undefined){
console.log('driver '+this.sortedDriversAray[i].id + ' is available and hasnt rejected,sending request')
this.driversRef.child(`${this.sortedDriversAray[i].id}`).update({ request: request }).then(()=>{
// watch driver and update changes
this.driversRef.child(`${this.sortedDriversAray[i].id}`).on("value",response=>{
let driverResponse = response.val().request
if(driverResponse == undefined){
console.log('driver '+this.sortedDriversAray[i].id+' just rejected,adding him to array');
this.rejecters.push(this.sortedDriversAray[i].id);
console.log(this.rejecters);
// inProgress = false;
}else if(driverResponse.accepted == true){
console.log('yay! driver '+this.sortedDriversAray[i].id+' just accepted');
// this.trackDriver(closestDriver.id)
// resolve(true) 
}
})
})
}else{
console.log('no drivers found')
this.loadingCtrl.dismiss();
resolve('no driver found')
}
}
})
}

我希望该函数首先发送到排序数组中的第一个驱动程序,等待他的响应,如果它被拒绝(即请求被删除并且现在未定义(,然后发送到下一个驱动程序,如果接受则停止 for 循环...请帮忙

for 循环不起作用,因为正如您发现的那样,它只会将它们全部触发。

相反,我认为你需要一个递归函数。

这只是一个快速的想法,显然我无法编译它,所以我不知道它是否有效,但它只是给你一个概念:

askNextDriver(sortedDriversAray, i) {
console.log('handling driver: '+sortedDriversAray[i].id);
// while(inProgress);  
// inProgress = true;   
if(sortedDriversAray[i].availability === true && this.rejecters.indexOf(sortedDriversAray[i]) <= -1 && sortedDriversAray[i].request == undefined){
console.log('driver '+sortedDriversAray[i].id + ' is available and hasnt rejected,sending request')
this.driversRef.child(`${sortedDriversAray[i].id}`).update({ request: request }).then(()=>{
// watch driver and update changes
this.driversRef.child(`${sortedDriversAray[i].id}`).on("value",response=>{
let driverResponse = response.val().request
if(driverResponse == undefined){
console.log('driver '+sortedDriversAray[i].id+' just rejected,adding him to array');
this.rejecters.push(sortedDriversAray[i].id);
console.log(this.rejecters);
// ASK NEXT DRIVER
if(i < sortedDriversAray.length) {
this.askNextDriver(sortedDriversAray, i++);
}
// END ASK NEXT DRIVER
// inProgress = false;
}else if(driverResponse.accepted == true){
console.log('yay! driver '+sortedDriversAray[i].id+' just accepted');
// this.trackDriver(closestDriver.id)
// resolve(true) 
}
})
})
}else{
console.log('no drivers found')
this.loadingCtrl.dismiss();
resolve('no driver found')
}
}

因此,当您获得初始驱动程序列表时,您开始使用它,然后每次驱动程序拒绝时,它都会检查是否有更多驱动程序,然后调用自己:

// ASK NEXT DRIVER
if(i < sortedDriversAray.length) {
this.askNextDriver(sortedDriversAray, i++);
}
// END ASK NEXT DRIVER

最新更新