【问题标题】:How to use a promise as filter callback in JavaScript? [duplicate]如何在 JavaScript 中使用 Promise 作为过滤器回调? [复制]
【发布时间】:2021-12-03 04:34:43
【问题描述】:

编辑解决方案在最后

我有很多组件必须通过某些属性进行过滤,问题是我无法在 Array.filter() 方法中使用它之前解决 promise。

这就是我现在正在做的事情

session.on("message_create", (msg) => {
  const matcher = new Matcher(msg);

  components
    .filter((c) => c.trigger == "message_create")
    .filter((c) => matcher.alias(c.alias))
    .filter(async (c) => await matcher.scope(c.scope))
    .forEach((c) => c.template(msg));
});

我不确定,但我认为未解决的承诺总是正确的......对吗?

这是 matcher.scope() 的代码

async scope(pattern?: string): Promise<boolean> {
  const chat = await this._msg.getChat();
  const contact = await chat.getContact();

  pattern = pattern ?? "anywhere";

  if (pattern == "anywhere") {
    console.log("anywhere");
    return true;
  }

  if (pattern == "group_only" && contact.isGroup) {
    console.log("group_only");
    return true;
  }

  if (pattern == "private_only" && contact.isUser) {
    console.log("private_only");
    return true;
  }

  return false;
}

如果你能帮助我减少条件量,那对我也有很大帮助。谢谢

编辑我将此问题标记为重复,因为原始帖子在解决我的问题方面帮助了我很多。它仍在进行中,但现在已经足够了

首先,我创建了一个可以通过将异步函数作为回调传递来过滤数组的方法,因此我尝试返回“this”来构建方法链接。那真是个坏主意。我不得不使用很多 .then 或 await,所以它变得比我想象的要复杂得多。

然后我尝试制作某种“界面”。同步函数将处理构建“.then 事物”的方法转换逻辑并返回 this

这是我最终想到的

class Handler {
  constructor(array) {
    this.array = array
    this.queue = Promise.resolve(this.array)
  }

  async asyncFilter(acall, array) {
    let aux = []

    for (let item of array)
      await acall(item) && aux.push(item)

    return aux
  }

  filter(acall) {
    this.queue = this.queue.then(array => this.asyncFilter(acall, array))

    return this
  }

  async resolve() {
    let aux = await this.queue
    this.queue = Promise.resolve(this.array)

    return aux
  }
}
async function main() {
  let handler = new Handler([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

  let result1 = handler
    .filter(elem => elem % 2 == 0)
    .filter(elem => elem > 5)

  console.log(await result1.resolve())

  let result2 = handler
    .filter(async elem => elem % 2 != 0)
    .filter(async elem => elem > 5)

  console.log(await result2.resolve())

  let result3 = handler
    .filter(elem => elem % 2 != 0)
    .filter(elem => elem < 5)

  console.log(await result3.resolve())
}

main()

结果就是这样

PS C:\Users\Smith\Desktop\Javascript\Async> node .\main.js
[ 6, 8, 10 ]
[ 7, 9 ]
[ 1, 3 ]

我感谢任何试图帮助我的人。我将致力于改进我的代码、处理错误等等。就是这样,谢谢大家

【问题讨论】:

  • 我要试试。我认为数组的结果也将是一个承诺,所以我想知道我使用的库将如何处理它
  • 没有人会因为你是初学者而称你愚蠢。但另一方面,这种异步模式可能非常复杂,对于初学者来说,您可能应该先了解基础知识,然后再进行更复杂的事情
  • 异步对我来说相当复杂。我有时可以处理 async/await,但是使用 Promise 类然后/catch 很难

标签: javascript typescript asynchronous


【解决方案1】:
async scope(pattern: string = 'anywhere'): Promise<boolean> {
  try {
    const chat = await this._msg.getChat();
    const contact = await chat.getContact();

    return pattern === 'anywhere' || pattern == "group_only" && contact.isGroup || pattern == "private_only" && contact.isUser; 
  } catch (err) {
    return false; // if any of the promises failed
  }
}

对于主函数

session.on("message_create", async (msg) => { // move async here

【讨论】:

  • 谢谢,它有助于在事件回调中使用异步
猜你喜欢
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2016-06-24
  • 2021-11-13
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多