javascript - 承诺中的 Twilio 方法不起作用
问题描述
阅读 https://www.twilio.com/blog/implementing-programmable-chat-php-laravel-vue-js 我尝试在我的 Laravel 8 / jQuery 3.5.1 / vue 2.6 应用程序中实现聊天。
该文档已定义:
setupChannel(channel){
let vm = this;
return this.leaveCurrentChannel()
.then(function() {
return vm.initChannel(channel);
})
.then(function(_channel) {
return vm.joinChannel(_channel);
})
.then(this.initChannelEvents);
},
我想扩展 joinChannel 方法,因为我想检查当前登录的用户(laravel auth)是否已经加入。我尝试用承诺和失败来实现它,就像里面的代码一样
vm.tc.messagingClient.getSubscribedUsers() is not run. I do
setupChannel(channel){
let vm = this;
return this.leaveCurrentChannel()
.then(function() {
return vm.initChannel(channel);
})
.then(function(_channel) {
let promise = new Promise((resolve, reject) => {
// debugger
vm.tc.messagingClient.getSubscribedUsers().then(function(users) {
// THESE CODE IS NOT RUN. If to uncomment console and debugging it is not triggered
// console.log('++ users::')
// console.log(users)
// debugger
for (let i = 0; i < users.length; i++) {
const user = users[i];
console.log('user.identity: ' + JSON.stringify(user.identity) );
// console.log('user: ' + JSON.stringify(user, null, 2) );
if( user.identity === vm.loggedUser.name ) {
resolve("result")
}
}
debugger // THESE CODE IS NOT RUN
resolve("error")
})
})
console.log('++ promise::')
console.log(promise) // I SEE this promise in pending state
promise
.then(
result => {
alert("result: " + result);
return _channel;
},
error => {
alert("error: " + error);
return vm.joinChannel(_channel);
}
)
// return vm.joinChannel(_channel);
})
.then(this.initChannelEvents);
如果运行代码
vm.tc.messagingClient.getSubscribedUsers().then(function(users)
...
在承诺范围内,它工作正常,我得到了有效的结果。
我的承诺结构有什么问题,我该如何解决?
修改块: 我尝试按照您的方式进行:
joinGeneralChannel() {
console.log('Attempting to join "general" chat channel...');
let vm = this;
if (this.tc.generalChannel == null) {
console.log('SETTING this.tc.messagingClient.createChannel')
vm.loadChannelList(vm.joinGeneralChannel);
}else {
// console.log('Found general channel:');
this.setupChannel(this.tc.generalChannel);
}
},
async setupChannel(channel) {
let vm = this
await this.leaveCurrentChannel()
const newChannel = await vm.initChannel(channel)
const subscribedUsers = vm.tc.messagingClient.getSubscribedUsers()
console.log('subscribedUsers::')
console.log(subscribedUsers)
let isUserJoined = false
for (let i = 0; i < subscribedUsers.length; i++) {
console.log('subscribedUsers[i] ' + JSON.stringify(subscribedUsers[i]) );
if( subscribedUsers[i].name === vm.loggedUser.name ) {
isUserJoined = true``
break
}
}
debugger
console.log('isUserJoined::')
console.log(isUserJoined)
但在我的浏览器中,我看到:
Initialized channel General Channel
TeamChat.vue?e1c8:561 subscribedUsers::
TeamChat.vue?e1c8:562 Promise {<pending>}__proto__: Promise[[PromiseState]]: "pending"[[PromiseResult]]: undefined
TeamChat.vue?e1c8:573 isUserJoined::
看起来方法 getSubscribedUsers 是异步的?
谢谢!
解决方案
可能你的 Promise 失败了,这就是为什么then()
永远不会执行。要扩展joinChannel
方法,您可以使用 async/await 和 ES6 语法执行以下操作:
async setupChannel(channel) {
let vm = this;
try {
await this.leaveCurrentChannel();
const newChannel = await vm.initChannel(channel);
const users = await vm.tc.messagingClient.getSubscribedUsers();
const isUserJoined = users.some(({ name }) => name === vm.loggedUser.name);
const joinedChannel = isUserJoined ? newChannel : vm.joinChannel(_channel);
return this.initChannelEvents(joinedChannel);
} catch(err) {
// if some of promises below will fail, here you'll see details
console.log('Issue details here:', err);
}
}
推荐阅读
- apache-superset - 在虚拟环境中安装超集的源代码在哪里?
- solr - 在 Solr Cloud schema.xml 和 Lucene Monitor 之间共享 lucene 分析器
- python-3.x - argparser - 添加位置参数,选项直接指定值
- node.js - 无法使用 TypeOrm 并找不到明确的“连接”默认值“
- sql - 获取输出的 SQL 查询
- c# - 绑定后对象数据未显示在 DataGridView 中
- c# - 使用 Task.Run 长时间运行的任务
- powershell - 将多个用户添加到 AD PowerShell 脚本
- angular - 尝试从 Angular HTTP 中的响应标头获取字符串值并映射到本地存储
- java - 如何从 JUnit 中的时间延迟条件中覆盖丢失的分支