2016-05-05 3 views
0

私はcodebirdライブラリを使用してTwitter APIへのリクエストを実行しています。これらのリクエストは正しく応答しますが、私はその応答を私のルートに通したいと思います。コールバックを関数チェーンに正常に渡すことができません

router.get('/twitter', function(req, res) { 

    twitterAPI.callAPI(function(tweetData) { 
    console.log('callback for twitterCall'); 
    res.send(tweetData); 
    }); 

}); 

これはmodule1.jsからの私のコードは次のとおりです:ここに私のroute.jsのスニペットがある適切な方法は、に至るまで、私のルートからそのコールバックを渡すことです何

require('es6-promise').polyfill(); 
require('isomorphic-fetch'); 
var Codebird = require("codebird"); 

// using twitter-aggregation app for consumer key and secret 
var params = { 
    screen_name: 'kanyewest' 
}; 

var config = { 
    twitter : { 
    consumerKey: 'thisismykey', 
    consumerSecret: 'thisismysecret' 
    } 
}; 

var cb = new Codebird; 
cb.setConsumerKey(config.twitter.consumerKey, config.twitter.consumerSecret); 

var tweetData = {}; 

// Function to call twitter api, called by route 
var callAPI = function(callback) { 

    getAccessToken(callback()); 

    console.log('callAPI function loaded'); 
}; 

var getAccessToken = function(callback) { 
    cb.__call(
    "oauth2_token", 
    {}, 
    function (reply, err) { 
     var accessToken; 
     console.log('1. response received'); 
     if (err) { 
      console.log("error response or timeout exceeded" + err.error); 
      return; 
     } 
     if (reply) { 
      console.log('2. twitter: reply received'); 
      console.log(reply); 
      accessToken = reply.access_token; 
      getUserTweets(accessToken, callback); 
     } 
    } 
); 
}; 

var getUserTweets = function(authToken, callback) { 
    console.log('passed accessToken'); 
    console.log(authToken); 
    console.log(typeof callback); 
    cb.__call(
    "users_show", 
    params, 
    function (reply, rate, err) { 
     if (err) { 
     console.log("Error in showing user or timed out" + err.error); 
     } 
     if (reply) { 
     console.log("received user's tweet"); 
     var newTweetData = { 
      screen_name: reply.screen_name, 
      name: reply.name, 
      status_text: reply.status.text, 
      status_date: reply.status.created_at, 
      status_retweets: reply.status.retweet_count, 
      status_favourites: reply.status.favorite_count 
     }; 
     console.log(newTweetData); 
     // final callback to set a variable 
     console.log(typeof callback); 
     setTweetData(newTweetData, callback); 
     // console.log('getUserTweets callback'); 
     // callback; 

     } 
    } 
); 
}; 

var setTweetData = function(newTweetData, callback) { 
    if(!newTweetData) { 
    return 'variable is a string, not function'; 
    } 

    tweetData = newTweetData; 
    console.log('tweet data has been set'); 
    console.log(callback); 
    callback(tweetData); 
}; 




module.exports = { params, callAPI }; 

わかりません私の関数チェーンの終わりは、私がtwitterデータを取得した後に私のres.send()がトリガーするようにします。

答えて

1

パラメータとして「コールバック」を渡し、コールしないようにcallApiメソッドを変更する必要があります。

var callAPI = function(callback) { 

    getAccessToken(callback); 
    // and not getAccessToken(callback()); 

    console.log('callAPI function loaded'); 
}; 

違いとして、コードでは認証の直後にコールバックを呼び出しています。

変更後、コールバックをgetUserTweets関数に渡し、つぶやきを取得した後にコールバックを呼び出します。

+0

はい最後に動作します。それで、getAccessTokenの最後に 'getAccessToken(callback())'コールバックコール()がありますか?私は関数が実行される前にコールバックをトリガして関数内でトリガしなければならないと思いましたか?これ、次のステップのリファクタリングに時間を費やしてくれてありがとう! – darkace

関連する問題