2017-09-25 3 views
1

JavaScriptを使用してfacebook send 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); 

は、基本的には、どのメッセージがsendstatus機能を使用してそれに応じてレスポンスを返送後、送信してすることができませんでしたしcorrespodingユーザIDが含まれていますSendMessage関数の内部でid_notsent変数を更新することです。問題は、callSendAPI関数が完了する前にsendmessageのコールバックが呼び出されていることです。


async/await ES8パターンの使い方:

答えて

1

私はPromiseの何らかの種類を返します(またはあなたがプロミスになることができるコールバックを持っています)。

あなたsendMessage()関数はその後、基本的に

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

のラインの周りにあるべき構造:その後、実際に私は何も送信していないです

+0

をコールバック彼らはPromise.allを使用して完了するのを待って、すべての通話のための約束を得ますcallSendAPI関数から戻ってきます。では、この場合、どのようにこのソリューションをさらに進めることができますか? –

+0

'callSendAPI'はPromiseを返すか、コールバックパラメータを提供する必要があります。そうしなければ、サーバーへの非同期呼び出しが完了したときを知ることはできません –

1

現在地複数soluceを持っています。

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

     await callSendAPI(messageData, pagetoken, id_notsent); 
    } 

    return ...; 
    } 

つもりコールcallSendAPI一つずつだ再帰関数を作成します。あなたはcallback(あなたが今何をしているか)、またはいずれかPromiseのいずれかを使用することができます

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

:たとえばについては

関連する問題