私は、News APIへの一連の呼び出しが行われ、ニュース記事のタイトルが巨大な文字列に抽出され、その文字列がフロントエンドのワードクラウドに配信されるオブジェクト。これまでのところ、私はアンダースコアの_.after
を使用し、すべてのAPI呼び出しが完了するまで私のアプリを待たせることを約束しました。processWordBank()
を呼び出す前に、巨大な文字列を取り除きオブジェクトにクリーンアップします。しかし、いったんprocessWordBank()
が呼び出されると、プログラムの流れはどこか分かりません。理想的には、processWordBank()
はobjをルータのcloudObjに返します。objをres.json()
に渡して応答として吐き出すことができます。私は_.after
の私の使用が奇妙な状況に置かれていると信じていますが、次の希望のアクションに進む前に、非同期呼び出しを終了して終了する唯一の方法です。助言がありますか?非同期API呼び出しを待つための約束の使い方
(私はすべての不要なコードを残したが、これは不十分であるなら、私が知っているようにしようとしました)
// includes...
var sourceString = ""
// router
export default ({ config }) => {
let news = Router()
news.get('/', function(req, res){
var cloudObj = getSources()
res.json({ cloudObj })
})
return news
}
// create list of words (sourceString) by pulling news data from various sources
function getSources() {
return getNewsApi()
}
// NEWS API
// GET top 10 news article titles from News API (news sources are determined by the values of newsApiSource array)
function getNewsApi() {
var finished = _.after(newsApiSource.length, processWordBank)
for(var i = 0; i < newsApiSource.length; i++) {
let options = {
uri: 'https://newsapi.org/v1/articles?source=' + newsApiSource[i] + '&sortBy=' + rank + '&apiKey=' + apiKey,
json: true
}
rp(options)
.then(function (res) {
let articles = res.articles // grab article objects from the response
let articleTitles = " " + _.pluck(articles, 'title') // extract title of each news article
sourceString += " " + articleTitles // add all titles to the word bank
finished() // this async task has finished
})
.catch(function (err) {
console.log(err)
})
}
}
// analyse word bank for patterns/trends
function processWordBank(){
var sourceArray = refineSource(sourceString)
sourceArray = combineCommon(sourceArray)
sourceArray = getWordFreq(sourceArray)
var obj = sortToObject(sourceArray[0], sourceArray[1])
console.log(obj)
return obj
}
'' *実際にしてみてください)(終了の代わりに*何かを返す**おそらく 'return finished()' - しかし、あなたは 'getNewsApi'が何かを返すことを望みます。 –