Я создаю API, который, когда GET, выполняется серия вызовов API Новостей, заголовки новостей выводятся в гигантскую строку, и эта строка обрабатывается в объект, который должен быть доставлен в wordcloud на интерфейсе. До сих пор я мог использовать _.after
underscore и запросить обещание сделать мое приложение до тех пор, пока все вызовы 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' тоже возвращал –