【发布时间】:2017-02-20 21:50:02
【问题描述】:
我正在创建一个 API,当 GET 时,对 News API 进行一系列调用,新闻文章标题被提取成一个巨大的字符串,并且该字符串被处理成一个对象以传递到前面的 wordcloud -结尾。到目前为止,我已经能够使用下划线的_.after 和request-promise 让我的应用程序等到所有API 调用完成后再调用processWordBank(),它将巨大的字符串清理成一个对象。但是,一旦调用processWordBank(),我就不明白程序的流程在哪里。理想情况下,processWordBank() 将 obj 返回到路由器中的 cloudObj,以便可以将 obj 传递给res.json() 并作为响应吐出。我相信我对_.after 的使用让我处于一个奇怪的境地,但这是我能够在进行下一个所需操作之前完成异步调用的唯一方法。有什么建议吗?
(我试图省略所有不必要的代码,但如果这还不够,请告诉我)
// 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
}
【问题讨论】:
-
而不是
finished()尝试实际返回 一些东西......也许return finished()- 但是你会希望getNewsApi也返回一些东西
标签: javascript node.js promise