gpt4 book ai didi

javascript - 如何将 Array.prototype.some() 与异步函数一起使用?

转载 作者:行者123 更新时间:2023-11-29 16:31:21 26 4
gpt4 key购买 nike

我正在尝试执行以下操作:

command.permissions.some(async permissionsKey => {
switch (permissionsKey) {
case "all": {
return true;
}
case "OWNER": {
return await msg.roomContext.isRoomOwnerId(msg.getStaticUserUID());
}
default: {
return config.users_groups[permissionsKey].includes(msg.getStaticUserUID());
}
}
});

然而,它始终为真,因为 Array.prototype.some 不期望异步函数,因此在调用该函数时会返回一个 promise。 Promise 是真实的。

我想知道最好的方法是将异步函数与任何 Array.prototype 函数一起使用,特别是 some 函数。

最佳答案

如果您希望在第一个 promise 以 true 解析时立即得到结果,您也可以这样做:

const somePromise = promises =>
new Promise((resolve, reject) => {
let resolveCount = 0;
const resolved = value => {
if (value) {
resolve(true);
} else if (++resolveCount === promises.length) {
resolve(false);
}
};

for (const promise of promises) {
promise.then(resolved, reject);
}
});

另一种奇特的方法:

const never = new Promise(() => {});

const somePromise = promises => Promise.race([
Promise.race(promises.map(async p => !!await p || never)),
Promise.all(promises).then(r => r.some(Boolean)),
]);

但是,在您的特定情况下,由于最多只有一个 promise ,因此有一种更好的方法:

let hasPermission =
command.permissions.some(permissionsKey => {
switch (permissionsKey) {
case "all":
return true;
case "OWNER":
return false;
default:
return config.users_groups[permissionsKey].includes(msg.getStaticUserUID());
}
});

if (!hasPermission && command.permissions.includes("OWNER")) {
hasPermission = await msg.roomContext.isRoomOwnerId(msg.getStaticUserUID());
}

关于javascript - 如何将 Array.prototype.some() 与异步函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com