[英]Run function after previous one is done
我正在嘗試從 PubNub 獲取未讀消息。 過程是這樣的:
我沒有運氣按順序運行這些功能。 在前一個完成后執行那個。
async function setGrant(){
await pubnub.grant(
{
channels: [userId.toString() + '.*'],
ttl: 55,
read: true,
write: true,
update: true,
get: true,
},(status) => {
return new Promise(function (resolve) {
resolve(status)
});
});
}
async function getMetadata() {
await pubnub.objects.getAllChannelMetadata(
{
include: {
customFields: true
}
}).then((res: any) => {
return new Promise(function (resolve) {
resolve(setChannelMetadata(res.data));
});
});
}
async function getUnreadedMessages() {
await pubnub.messageCounts({
channels: channels,
channelTimetokens: tokens,
}).then((res: any) => {
console.log(res);
return new Promise(function (resolve) {
resolve(setUnreadMessage(res));
});
});
}
async function setChannelsAndTokens(){
channelMetadata.forEach((value, index) => {
tokens.push(value.custom.lastToken);
channels.push(value.id)
});
return new Promise(function (resolve) {
getUnreadedMessages()
resolve("Chanells and tokens set!");
})
}
function getUnreadMessagesProccess() {
return setGrant().then(getMetadata).then(setChannelsAndTokens).then(getUnreadedMessages)
}
以經驗編碼風格使用async
和await
。 這有助於組織代碼。 使代碼易於閱讀。 這也有助於操作順序。
我們所做的是在每個函數中的await
和promise
前添加一個return
。 這允許我們在每個函數完成執行后分配結果變量,同時在編寫代碼時保留執行順序。
💡注:當SDK與初始化
secretKey
,也沒有必要授予自己對資源的訪問。 就像您已經擁有權限一樣,只需使用任何方法即可。 SDK 將使用您的密鑰自動簽署所有請求。
通過按Run code snippet
下方的Run code snippet
按鈕進行測試。
(async ()=>{ 'use strict'; const publishKey = "pub-c-51f1008b-7ddf-42b7-aec9-2d0153b0e766"; const subscribeKey = "sub-c-1597b696-05af-11e6-a6dc-02ee2ddab7fe"; const secretKey = "sec-c-YTVjYjUzMWMtM2MxZC00YzdiLWE0ZjAtNWRmMWVmYmNkZGNl"; const myUUID = "myUniqueUUID" const pubnub = new PubNub({ publishKey : publishKey, subscribeKey : subscribeKey, secretKey : secretKey, uuid : myUUID, }); const unread = await getUnreadMessagesProccess(); async function getUnreadMessagesProccess() { const tokens = ['1000']; const channels = ['1234567']; const userId = 1234567; const auth = await setGrant(userId); log([{statusCode: auth.statusCode}]); const channelMetadata = await getMetadata(); log([channelMetadata,channels,tokens]); setChannelsAndTokens(channelMetadata, channels, tokens); const unread = await getUnreadedMessages(channels, tokens); log([unread]); return unread; } async function setGrant(userId) { return new Promise( async resolve => { await pubnub.grant({ channels: [userId.toString() + '.*'], ttl: 55, read: true, write: true, update: true, get: true, }, response => resolve(response)); }); } async function getMetadata() { const options = {include: {customFields: true}}; return await pubnub.objects.getAllChannelMetadata(options); /* .then((res: any) => { return new Promise(function (resolve) { resolve(setChannelMetadata(res.data)); }); }); */ } function setChannelsAndTokens(channelMetadata, channels, tokens) { channelMetadata.data.forEach((value, index) => { tokens.push(value.custom.lastToken); channels.push(value.id) }); } async function getUnreadedMessages(channels, tokens) { return await pubnub.messageCounts({ channels: channels, channelTimetokens: tokens, }); /*.then((res: any) => { console.log(res); return new Promise(function (resolve) { resolve(setUnreadMessage(res)); }); });*/ } function log(data) { // console.log(data); document.querySelector("#out").innerHTML += `<div>${JSON.stringify(data)}</div>` } })();
<div id="out"></div> <script src="https://cdn.pubnub.com/sdk/javascript/pubnub.4.33.0.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.