在循环内等待API的结果

时间:2019-06-24 06:42:43

标签: javascript node.js es6-promise

我是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);

它返回一个空数组。

4 个答案:

答案 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);
      });