簡體   English   中英

上一個完成后運行函數

[英]Run function after previous one is done

我正在嘗試從 PubNub 獲取未讀消息。 過程是這樣的:

  1. 設置補助金
  2. 獲取頻道元數據
  3. 獲取未讀消息等...

我沒有運氣按順序運行這些功能。 在前一個完成后執行那個。

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)
}

上一個完成后運行函數

以經驗編碼風格使用asyncawait 這有助於組織代碼。 使代碼易於閱讀。 這也有助於操作順序。

我們所做的是在每個函數中的awaitpromise前添加一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM