【问题标题】:Promise used for concatanation of array from different arraysPromise 用于连接来自不同数组的数组
【发布时间】:2018-08-17 17:43:08
【问题描述】:

我想在其他 3 个数组的帮助下构造一个数组。我为此目的使用 JS 承诺,但无法正确实现。 所以我基本上想做的是先填充一个数组。

let getPlacePromise = function() {
      return new Promise(function(resolve,reject){
        this.getplaceArray= this.getfilterPlaces(inputdata);
        resolve("got places\n" ); 
      });
  };

  let getTransporterPromise= function(message) {
    return new Promise(function(resolve,reject){
      this.getTransporterArray= this.getfilterTransporter(inputdata);
      resolve(message+"got Transporter"); 
    });
  }; 

  let getVehiclePromise = function(message) {
    return new Promise(function(resolve,reject){
      this.getVehicleArray= this.getfilterVehicles(inputdata);
      resolve(message+"got vehicle"); 
    });
  };

  getPlacePromise().then(function(result){
      return getTransporterPromise(result);
  }).then(function(result){
      return getVehiclePromise(result);
  }).then(function(result){
    this.AllDropdownValues= this.getTransporterArray.concat(this.getVehicleArray);
  });

我知道这段代码应该有错误。我无法提出正确的实施方案。我希望 getplaceArray 先填充,而不是只填充其他其他数组。是否可以在 Promise 中调用函数。我在这里遇到的错误是 getplaceArray, getTransporterArray, getVehicleArray 未定义。

getfilterTransporter 函数:

getfilterTransporter(autocompleteInputData) {

var k= this.checkRegex(autocompleteInputData);
this.getfilteredTransporter= this.filterTransporters(k);
return this.formatTransporterValue(this.getfilteredTransporter);

}

getfilterVehicle:

getfilterVehicles(autocompleteInputData) {

  var k= this.checkRegex(autocompleteInputData);
    this.getfilteredVehicle= this.filterVehicles(k);
    return this.formatVehicleValue(this.getfilteredVehicle);
}

getfilterPlace

getfilterPlaces(autocompleteInputData) {
  if (autocompleteInputData == '' || typeof(autocompleteInputData) == 'object') 
  return null;
  this.placeData.getPlacesFromPig(autocompleteInputData)
  .subscribe(response => {
     return this.formatPigResponse(response);
   }); 

}

编辑

稍微修改了答案。其余工作正常,但 this.getfilterPlaces 内部运行 subscribe 方法以填充数据,但无法正常工作。

let a=[], b=[],c=[];
    a=  this.getfilterPlaces(inputdata);
    b= this.getfilterTransporter(inputdata);
    c= this.getfilterVehicles(inputdata);

    let getplaceArray = [],
  getTransporterArray = [],
  getVehicleArray = [];

let getPlacePromise = function () {
  const self = this;
  return new Promise(function (resolve, reject) {
    getplaceArray = a;
    resolve("got places\n");
  });
};

let getTransporterPromise = function (message) {
  const self = this;
  return new Promise(function (resolve, reject) {
    getTransporterArray =  b
    resolve(message + "got Transporter");
  });
};

let getVehiclePromise = function (message) {
  const self = this;
  return new Promise(function (resolve, reject) {
    getVehicleArray = c
    resolve(message + "got vehicle");
  });
};

getPlacePromise().then(function (result) {
  return getTransporterPromise(result);
}).then(function (result) {
  return getVehiclePromise(result);
}).then(function (result) {
  var AllDropdownValues = getTransporterArray.concat(getVehicleArray).concat(getplaceArray);
  console.log(AllDropdownValues);
});

答案是 async 和 await 的使用。下面是代码。

async function getfilterPlaces(autocompleteInputData) {
  if (autocompleteInputData == '' || typeof(autocompleteInputData) == 'object') 
    return null;
  return this.placeData.getPlacesFromPig(autocompleteInputData)
    .toPromise()
    .then(response => this.formatPigResponse(response));
}

在调用函数 filterAllComponent(inputdata) 时:

async function filterAllComponent(inputdata) {
  let a=[], b=[], c=[];
  a = await this.getfilterPlaces(inputdata);
  b = this.getfilterTransporter(inputdata);
  c = this.getfilterVehicles(inputdata);
[...]

【问题讨论】:

  • 是任何this.getfilter* 函数异步 ?
  • 不,没有。
  • 那么,你为什么还要为 Promises 烦恼呢?
  • 哦,我明白了问题... this 里面的return new Promise(function(resolve,reject){ 不是你认为的this this
  • getplaceArray, getTransporterArray, getVehicleArray 三个都有不同的范围。

标签: javascript angular promise angular-promise


【解决方案1】:

试试这个

let getplaceArray = [],
  getTransporterArray = [],
  getVehicleArray = [];

let getPlacePromise = function () {
  const self = this;
  return new Promise(function (resolve, reject) {
    getplaceArray = self.getfilterPlaces(inputdata);
    resolve("got places\n");
  });
};

let getTransporterPromise = function (message) {
  const self = this;
  return new Promise(function (resolve, reject) {
    getTransporterArray = self.getfilterTransporter(inputdata);
    resolve(message + "got Transporter");
  });
};

let getVehiclePromise = function (message) {
  const self = this;
  return new Promise(function (resolve, reject) {
    getVehicleArray = self.getfilterVehicles(inputdata);
    resolve(message + "got vehicle");
  });
};

getPlacePromise().then(function (result) {
  return getTransporterPromise(result);
}).then(function (result) {
  return getVehiclePromise(result);
}).then(function (result) {
  this.AllDropdownValues = getTransporterArray.concat(getVehicleArray);
});

【讨论】:

  • this is not required - 你假设对 OP 的未成文代码了解很多!
  • @RahulSharma 不工作。我稍微修改了函数。检查我的编辑。休息正在工作,但 getfilterPlaces 仍未到来。我正在分享负责填充 getfilterPlaces 的确切功能。
  • 试试这个getTransporterArray.concat(getVehicleArray).concat(getplaceArray)
  • 做到了。检查我的编辑。这两个数据来了,但不是 getfilterPlaces
  • @UDGogs 我认为不需要承诺,因为你没有在其中做任何事情。
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多