uni-app uniPush.sendMessage()并行发送到不同用户时发送异常
uni-app uniPush.sendMessage()并行发送到不同用户时发送异常
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 22h2 | HBuilderX |
产品分类:uniapp/H5
浏览器平台:Chrome
浏览器版本:119.0.6045.200
示例代码:
for(xxxxxx){
let pushSend = {
"user_id": xxxxx,
"title": title,
"content": content,
"payload": {
"oids":xxx
}
}
uniPush.sendMessage(pushSend)
.then(res=>{
console.log("push res:", res);
if(res.errCode){
console.log("推送失败:", res.errMsg);
}
})
.catch(err=>{
console.log("push err:", err);
})
}
操作步骤:
for(xxxxxx){
let pushSend = {
"user_id": xxxxx,
"title": title,
"content": content,
"payload": {
"oids":xxx
}
}
uniPush.sendMessage(pushSend)
.then(res=>{
console.log("push res:", res);
if(res.errCode){
console.log("推送失败:", res.errMsg);
}
})
.catch(err=>{
console.log("push err:", err);
})
}
预期结果:
不同用户都正确收到推送消息
实际结果:
一个用户没有收到消息,一个用户重复收到两条一样内容的消息。
3 回复
在服务端异步调用?这样可能还会出现:请求还没完成,云函数实例就已经结束的情况。
这种业务场景可以使用 promise all实现,另外注意每个任务需要调用一次 uniCloud.getPushManager使得每个任务拿到的是不同的实例
“每个任务需要调用一次 uniCloud.getPushManager使得每个任务拿到的是不同的实例”,这个麻烦在文档里面说明一下?
在使用 uni-app
的 uniPush.sendMessage()
方法时,如果并行发送消息到不同用户时出现异常,可能是由于以下几个原因导致的。你可以根据这些原因进行排查和解决:
1. 并发限制
- 问题描述:
uniPush.sendMessage()
可能在处理并发请求时存在限制,导致并发量过大时出现异常。 - 解决方案:尝试对发送请求进行限流,例如通过队列或分批发送的方式,减少并发量。可以使用
Promise.all()
来控制并发请求的数量。
const users = ['user1', 'user2', 'user3'];
const sendMessagePromises = users.map(user => uniPush.sendMessage(user, 'your message'));
// 控制并发数量
const concurrency = 5; // 每次最多发送5条消息
const chunkedPromises = [];
for (let i = 0; i < sendMessagePromises.length; i += concurrency) {
chunkedPromises.push(Promise.all(sendMessagePromises.slice(i, i + concurrency)));
}
Promise.all(chunkedPromises)
.then(() => console.log('All messages sent successfully'))
.catch(err => console.error('Error sending messages:', err));
2. API 限制
- 问题描述:
uniPush
的 API 可能存在调用频率限制,导致在短时间内发送大量请求时被拒绝或失败。 - 解决方案:查阅
uniPush
的官方文档,了解 API 的调用频率限制,并根据限制调整发送策略。可能需要增加延迟或使用队列来管理发送任务。
3. 网络问题
- 问题描述:并发请求可能会对网络造成压力,导致部分请求超时或失败。
- 解决方案:确保网络稳定,并考虑增加重试机制来处理失败请求。
const sendMessageWithRetry = async (user, message, retries = 3) => {
for (let i = 0; i < retries; i++) {
try {
await uniPush.sendMessage(user, message);
return;
} catch (err) {
if (i === retries - 1) throw err;
await new Promise(resolve => setTimeout(resolve, 1000)); // 延迟1秒后重试
}
}
};
const users = ['user1', 'user2', 'user3'];
Promise.all(users.map(user => sendMessageWithRetry(user, 'your message')))
.then(() => console.log('All messages sent successfully'))
.catch(err => console.error('Error sending messages:', err));
4. 用户 Token 失效
- 问题描述:如果用户的推送 Token 失效或未正确获取,会导致消息发送失败。
- 解决方案:确保在发送消息前,每个用户的推送 Token 是有效的。可以在发送前进行 Token 校验,并在 Token 失效时重新获取。
5. 日志与调试
- 问题描述:如果没有详细的日志信息,可能难以定位具体问题。
- 解决方案:在发送消息时,增加详细的日志记录,捕获并记录每个请求的响应状态和错误信息,以便更好地排查问题。
const sendMessageWithLog = async (user, message) => {
try {
const result = await uniPush.sendMessage(user, message);
console.log(`Message sent to ${user}:`, result);
return result;
} catch (err) {
console.error(`Failed to send message to ${user}:`, err);
throw err;
}
};
const users = ['user1', 'user2', 'user3'];
Promise.all(users.map(user => sendMessageWithLog(user, 'your message')))
.then(() => console.log('All messages sent successfully'))
.catch(err => console.error('Error sending messages:', err));