当我使用 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);     
}