我是Node的新手,我想了解Promise,但这有点复杂。 我试图多次调用API,然后返回结果。但是我的路线首先发送了响应。
我只想在循环完成后返回响应
data = {}
req.body.words.forEach(function (word) {
newsapi.v2.everything({
q: word,
domains: req.body.domains.join(', '),
sort_by: 'relevancy'
})
.then(response => {
data[word]=response;
})
});
return res.json(data);
它返回一个空数组。
答案 0 :(得分:2)
您的循环是同步的,它正在启动异步调用,但从不等待它们。
您可以使用df1 = (df.groupby(['Name','Speaker'], sort=False)
.agg({'StTime':'first',
'Text': lambda x: ' '.join(y for y in x if y != ''),
'EnTime':'last'})
.reset_index())
print (df1)
Name Speaker StTime Text EnTime
0 s1 tom 6.8 I would say leap frog a pig. 10.1
并行获取所有结果。或者可以并行或串行方式使用Promise.all
。
async-await
我针对相同的问题发表了一篇中等文章:https://medium.com/trappedpanda/loops-asynchronous-functions-and-returning-collective-results-in-node-js-b7566285fb74
答案 1 :(得分:0)
这是因为请求是异步的,您需要解决一些问题才能保留结果,直到所有请求完成为止,您可以像这样通过计数器来实现:
data = {}
const promises = [];
req.body.words.forEach(function (word) {
const promise = newsapi.v2.everything({
q: word,
domains: req.body.domains.join(', '),
sort_by: 'relevancy'
})
.then(response => {
data[word] = response;
})
promises.push(promise);
});
Promise.all(promises)
.then(()=>{
res.send(data);
})
答案 2 :(得分:0)
~
答案 3 :(得分:0)
您可以使用“ for-async” npm:
var forAsync = require("for-async");
data = {}
forAsync(req.body.words, function (word, i) {
return new Promise(function (next) {
newsapi.v2.everything({
q: word,
domains: req.body.domains.join(', '),
sort_by: 'relevancy'
})
.then(response => {
data[word]=response;
next(); //go to the next iteration
});
});
}).then(() => {
console.log("Loop finished");
return res.json(data);
});