【发布时间】: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