2017-09-25 86 views
1

我正在使用javascript來使用facebook發送api。在javascript中運行一個接一個的函數

function sendmessage(callback) { 
    for (i = 0; i < recipientId.length; i++) { 
     var messageData = { 
     recipient: { 
      id: recipientId[i] 
     }, 
     message: { 
      text: messageText 
     } 
     }; 
     callSendAPI(messageData, pagetoken, id_notsent); 
    } 
    return callback(); 
    } 

    function sendstatus() { 
    if (id_notsent.length == 0) { 
     res.statusCode = 200; 
     res.message = "Successfully sent generic message to all recipients"; 
    } else { 
     res.statusCode = 400; 
     res.message = "Unable to send message to all users. Message not sent to recipients : " + id_notsent.toString(); 
    }; 
    resp.send(res); 
    } 
    sendmessage(sendstatus); 

什麼,我要做的是更新SendMessage函數將基本上包含用戶ID correspoding到消息無法發送,然後相應地發回的響應使用sendstatus函數內部的id_notsent變量。但問題在於sendSessage中的回調在callSendAPI函數完成之前被調用。

回答

1

我懷疑callSendAPI返回某種Promise(或有一個回調,你可以變成一個承諾)。

的結構,那麼你的sendMessage()功能應該是圍繞

const promises = recipentId.map(id => { 
    ... 
    return callSendAPI(messageData, pagetoken, id_notsent); 
}); 
Promise.all(promises).then(callback); 

基本上線:獲得適用於所有電話的承諾,恨不得用Promise.all完成,然後回調

+0

其實我沒有發送任何從callSendAPI函數返回。那麼如何在這種情況下進一步採用這種解決方案呢? –

+0

'callSendAPI'必須返回一個Promise或者提供一個回調參數。如果不這樣做,則無法知道何時完成對服務器的異步調用 –

1

您有多個soluce這裏:


使用async/await ES8模式。

function async sendmessage() { 
    for (i = 0; i < recipientId.length; i++) { 
     var messageData = { ... }; 

     await callSendAPI(messageData, pagetoken, id_notsent); 
    } 

    return ...; 
    } 

創建一個遞歸函數那會打電話一一callSendAPI

例如

function sendmessage({ 
    recipientId, 
    callback, 
    i = 0, 
    rets = [], 
}) { 
    // our work is done 
    if (i >= recipientId.length) return callback(rets); 

    const messageData = { ... }; 

    // Perform one request 
    callSendAPI(messageData, pagetoken, id_notsent, (ret) => { 

     // Call next 
     return sendmessage({ 
     recipientId, 
     callback, 
     rets: [ 
      ...rets, 
      ret, 
     ], 
     i: i + 1, 
     }); 
    }); 
    } 

您可以使用callback(你現在在做什麼),或任一Promise

相關問題