Обещание не работает должным образом, когда я использую внутри карты, используя JavaScript
Я пишу функцию JavaScript для обработки вызовов API внутри метода карты, прежде чем выполнить все задачи внутри метода карты, моя функция выполнить неверный результат. Но это не работает для моих ожиданий.
мой код:
function vehicleAndWorker(hook){
var routeArray = [];
return new Promise(function(resolve, reject) {
hook.data.map(d => {
var routeArray = [];
delete d.driverId
delete d.vehicle
delete d.workers
return hook.app.service('vehicles')
.find({ query: {vehicleId: d.vehicleId}})
.then(result=>{
var vehicleTypeId = result.data[0].vehicleTypeId;
return hook.app.service('vehicle-types')
.find({ query: {vehicleTypeId: vehicleTypeId }})
.then(result=>{
d.vehicle = {
vehicleId: d.vehicleId,
vehicleTypeId: vehicleTypeId,
fixedCost: result.data[0].fixedCost,
variableCost: result.data[0].variableCost
}
return hook.app.service('workers')
.find({ query: {assignedVehicleId: d.vehicleId}})
.then(result=>{
d.workers = [{
id:result.data[0].workerId,
name:result.data[0].name,
type:result.data[0].type
}];
delete d.vehicleId;
})
})
})
})
resolve(hook)
})
}
перед тем, как выполнить мою работу с картой, вернемся в выполнение, как решить эту проблему.
3 ответа
Решение
Сначала цепляйте свои обещания, а не вкладывайте их. если вы используете вложение, тогда вам не нужно обещание.
второе использование обещают все
function vehicleAndWorker(hook){
var all = [];
var i =0;
hook.data.map(d => {
delete d.driverId
delete d.vehicle
delete d.workers
all[i] = hook.app.service('vehicles')
.find({ query: {vehicleId: d.vehicleId}})
.then(result=>{
var vehicleTypeId = result.data[0].vehicleTypeId;
return hook.app.service('vehicle-types').find({ query: {vehicleTypeId: vehicleTypeId }})
})
.then(result=>{
d.vehicle = {
vehicleId: d.vehicleId,
vehicleTypeId: vehicleTypeId,
fixedCost: result.data[0].fixedCost,
variableCost: result.data[0].variableCost
}
return hook.app.service('workers').find({ query: {assignedVehicleId: d.vehicleId}})
})
.then(result=>{
d.workers = [{
id:result.data[0].workerId,
name:result.data[0].name,
type:result.data[0].type
}];
delete d.vehicleId;
return result
})
i++;
})
return Promise.all(all).then(hook);
}
Попробуйте использовать Promise.all()
Ваш вызов ".map" возвращает набор Обещаний. Так что возвращается безотлагательно,
function vehicleAndWorker(hook){
var routeArray = [];
return new Promise(function(resolve, reject) =>
Promise.all(hook.data.map(d => {....})
.then(() => resolve(hook))
);
}
Как упоминал @Akshay, мы можем даже уменьшить этот код функции и переместить вашу функцию "map" в какую-то другую, так что ваш файл будет одной строкой:
var vehicleAndWorker = (hook) => Promise.all(hook.data.map(d => your_map_function)
.then(() => hook);
Попробуй это
function vehicleAndWorker(hook){
var routeArray = [];
return new Promise(function(resolve, reject) {
hook.data.map(d => {
var routeArray = [];
delete d.driverId
delete d.vehicle
delete d.workers
hook.app.service('vehicles')
.find({ query: {vehicleId: d.vehicleId}})
.then(result=>{
var vehicleTypeId = result.data[0].vehicleTypeId;
hook.app.service('vehicle-types')
.find({ query: {vehicleTypeId: vehicleTypeId }})
.then(result=>{
d.vehicle = {
vehicleId: d.vehicleId,
vehicleTypeId: vehicleTypeId,
fixedCost: result.data[0].fixedCost,
variableCost: result.data[0].variableCost
}
hook.app.service('workers')
.find({ query: {assignedVehicleId: d.vehicleId}})
.then(result=>{
d.workers = [{
id:result.data[0].workerId,
name:result.data[0].name,
type:result.data[0].type
}];
delete d.vehicleId;
})
})
})
resolve(hook)
})
})
}