当我使用 javascript 使用内部地图时,Promise 无法正常工作
Promise not working properly when I use inside map using javascript
我正在编写一个 JavaScript 函数来处理 map 方法内部的 API 调用,在完成 map 方法内部的所有任务之前,我的函数是执行错误的结果。但这并不符合我的期望。
我的代码:
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)
})
}
在执行我的地图作业之前,执行了 return 如何解决这个问题。
试试这个
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)
})
})
}
尝试使用Promise.all()
您的“.map”调用 returns 一组 Promise。所以它 returns immidiatly,
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);
首先链接你的 promise 而不是嵌套它们。如果你使用嵌套那么你就不需要 promise。
第二次使用 promise all
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);
}
我正在编写一个 JavaScript 函数来处理 map 方法内部的 API 调用,在完成 map 方法内部的所有任务之前,我的函数是执行错误的结果。但这并不符合我的期望。
我的代码:
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)
})
}
在执行我的地图作业之前,执行了 return 如何解决这个问题。
试试这个
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)
})
})
}
尝试使用Promise.all()
您的“.map”调用 returns 一组 Promise。所以它 returns immidiatly,
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);
首先链接你的 promise 而不是嵌套它们。如果你使用嵌套那么你就不需要 promise。
第二次使用 promise all
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);
}