typescript 如何在javascript中使用承诺字符串标签

3duebb1j  于 2023-02-25  发布在  TypeScript
关注(0)|答案(2)|浏览(93)

我试着用下面的承诺。

let promiseArray: [string, Promise<unknown>][] = [];
for(const a of array)
{
   const promise = new Promise(() => {this.repository.getRepository<a.entity>.find()});
   promiseArray.push([a.entityName, promise]);
}

上面代码的结果是:

result : [
    ['EntityName', [{},{},{}]],
    ['EntityName2', [{},{},{}]],
     ....
]

但是我不知道如何将promiseArray应用于promise.all

await Promise.all(promiseArray)
          .then((res) => {
            console.log(res);
          })
          .catch((e) => console.error(e));

我尝试了上面的方法,但是没有效果,我尝试了promiseArray.map((pm)=>pm[1]),但是我无法Mappm[0]的值。

x3naxklr

x3naxklr1#

看起来你填充数组的方式不对。从你的代码来看,你使用的是TypeORM,并且.find()是异步的(返回一个promise)。因此,你不需要用另一个promise来 Package 它。尝试如下填充数组:

let promiseArray: [string, Promise<unknown>][] = [];
for(const a of array)
{
   const promise = this.repository.getRepository<a.entity>.find();
   promiseArray.push([a.entityName, promise]);
}

然后,您只需执行.map()来获取数组中的第二个值,这是.find()返回的承诺:

await Promise.all(promiseArray.map(el => el[1]));

如果需要将.entityName与promise的结果沿着传递,则将每个元素Map到其.find() promise,然后将实体名称添加到.then()中的结果,这将为array中的每个元素创建一个promise,并且可以简单地传递给Promise.all()

const promiseArray: [Promise<[string, unknown]>][] = array.map(el => this.repository.getRepository<a.entity>.find().then(res => [el.entityName, res]));
const results = await Promise.all(promiseArray);
z31licg0

z31licg02#

Promise.all接受一系列承诺,但你有一系列-

Array<[String, Promise]>

你需要用不同的方式来构建承诺的数组-

const promiseArray: Promise<Array<[string, unknown]>> = []

for (const a of array) {
   const promise = new Promise((resolve, reject) => {
     // ...
   })
   .then(result => [a.entityName, result]) // ✅ 
   promiseArray.push(promise)
}

现在您可以使用Promise.all-

Promise.all(promisesArray).then(...)

结果-

[
  ['EntityName', <promise result>],
  ['EntityName2', <promise result>],
  ...
]

这里有一个功能性的例子-

const randPromise = () =>
  new Promise(r =>
    setTimeout(r, 1000, Math.random() * 100 | 0)
  )
  
const labels = ["a", "b", "c", "d"]
  
const promises = []

for (const label of labels)
  promises.push(randPromise().then(value =>
    [label, value]
  ))
  
Promise.all(promises)
.then(JSON.stringify)
.then(console.log)
.catch(console.error)
// [["a",53],["b",25],["c",22],["d",53]]

许多人发现使用数组的map函数比使用for..of循环更容易-

const randPromise = () =>
  new Promise(r =>
    setTimeout(r, 1000, Math.random() * 100 | 0)
  )
  
const labels = ["a", "b", "c", "d"]
  
Promise.all(labels.map(label =>
  randPromise().then(value => [label, value])
))
.then(JSON.stringify)
.then(console.log)
.catch(console.error)
// [["a",90],["b",20],["c",76],["d",60]]

每个then表达式都有一个等价的async..await表示。这种方法使用较少的嵌套lambda,因此更容易理解。

const randPromise = () =>
  new Promise(r =>
    setTimeout(r, 1000, Math.random() * 100 | 0)
  )
  
const labels = ["a", "b", "c", "d"]
  
Promise.all(labels.map(async label =>
  [label, await randPromise()]
))
.then(JSON.stringify)
.then(console.log)
.catch(console.error)
// [["a",90],["b",20],["c",76],["d",60]]

相关问题