javascript - 我必须发出第二个 GET 请求才能获得我想要的响应

标签 javascript node.js asynchronous express

我第一次向此端点发送 GET 请求时,响应为: allEvents = []。如果我等待几秒钟并再次点击端点,我会收到(所需的结果)一个填充的 allEvents 数组。所以第一次发射时它不能正常工作。

注意行 console.log(I am inside the function)。这仅在我第一次到达端点后几秒钟出现。

如何确保第一次访问 API 端点时执行此函数?

var request = require('request');

var allEvents = [];

module.exports = function(req, res, next) {

    console.log("INSIDE MODULE ___ BEFORE FUNCTION");

    (function goToEB(){
        request({
            url: process.env.MY_OWNED_EVENTS,
            method: 'GET'
            }, function(error, response, body){
                console.log("INSIDE FUNCTIONNNNNN");
                if (error) {
                    return console.log(error);
                } else {
                    var data = JSON.parse(response.body);
                    var events = data.events;

                    for (var i = 0; i < events.length; i++) {
                        var event = {
                          name: events[i].name.text,
                          description: events[i].description.text,
                          id: events[i].id,
                          url: events[i].url,
                          start: events[i].start.local,
                          end: events[i].end.local
                      }
                      if (!eventDoesExist(event, allEvents)) {
                        allEvents.push(event);
                      } else {
                        console.log("EVENT EXISTS");
                      }
                    };
                    return allEvents;
                }
        })
    })();

    function eventDoesExist(obj, list) {
        var i;
        for (i = 0; i < list.length; i++) {
            if (list[i] === obj) {
                return true;
            }
        }
        return false;
    }

        res.send(allEvents);

}

最佳答案

您将在第二个请求返回任何数据并填充 allEvents 之前发送响应。移动

res.send(allEvents);

像这样进入您的请求的回调:

                ...
                for (var i = 0; i < events.length; i++) {
                    var event = {
                      name: events[i].name.text,
                      description: events[i].description.text,
                      id: events[i].id,
                      url: events[i].url,
                      start: events[i].start.local,
                      end: events[i].end.local
                  }
                  if (!eventDoesExist(event, allEvents)) {
                    allEvents.push(event);
                  } else {
                    console.log("EVENT EXISTS");
                  }
                };

                res.send(allEvents);
                ....

关于javascript - 我必须发出第二个 GET 请求才能获得我想要的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32228963/

相关文章:

c# - 是否有可能将委托(delegate)的执行从一个线程移动到另一个中间执行?

ios - dispatch_group_notify 不等待一个 dispatch_group_async

javascript - jQuery Lite 内容 slider - 将类添加到当前幻灯片

javascript - 使用 Gulp 启动非常慢的 BrowserSync 服务器

javascript - 多次调用 async.eachSeries 回调

javascript - 将字节传递给 NodeJS 插件

objective-c - 对象 PromiseKit : Add new promises from within a promise

javascript - 在 ASP.NET MVC - Javascript 应用程序中处理日期的最佳方式

javascript - AngularJS 的未知提供者

javascript - Node.js集成测试+数据库