NodeJS ~ 我将函数从同步更改为异步,现在我的代码无法工作

问题描述 投票:0回答:1

我正在尝试使用 Facebook Graph API 递归获取我的所有 Facebook 帖子。

对 Facebook API 的简单 GET 请求不会返回我的所有帖子。相反,它返回一个分页响应

{"data": [
     {Facebook post},
     {Facebook post},
     {Facebook post}.
     etc
    ],
  "paging": {
          "next":Url (api endpoint) to next page of results
   }
}

因此,我必须递归地在 paging.next 上发出 GET 请求来检索我的所有帖子。

使用同步 HTTP 请求来完成此操作很容易。但我正在使用 NodeJS,而且我一直听说我应该保持异步。因此,我将 HTTP GET 请求方法更改为“异步”。 为了获得异步 HTTP GET 请求的一些控制流,我使用了

async

npm 模块;特别是,async.waterfall 这是我的带有 async.waterfall 的

recursion

函数: function getAllPosts(responseObj, masterPosts) { masterPosts = typeof masterPosts !== 'undefined' ? masterPosts : {'data':[]}; var posts = responseObj['data']; masterPosts['data'] = masterPosts['data'].concat(posts); if (responseObj.hasOwnProperty('paging') && responseObj['paging'].hasOwnProperty('next')) { var r; async.waterfall([ function(callback){ r = httpGet(responseObj['paging']['next']); callback(null, r); }, function(arg1, callback){ getAllPosts(JSON.parse(arg1), masterPosts); callback(null, 'done'); }, ], function (err, result) { //result now == 'done' }); } return masterPosts; }

httpGet

函数是异步的。我尝试了这个,但不起作用:(我的结果仍然只有我的 Facebook 帖子的一半。 函数参数

responseObj

是一个JavaScript对象~刚刚解析了分页的JSON响应 我在这里缺少什么?

node.js facebook asynchronous recursion
1个回答
0
投票
sync-request-curl

,我在 2023 年编写的一个库,将帮助使用 libcurl 的 Easy 接口发送同步 HTTP 请求。

npm:
    https://www.npmjs.com/package/sync-request-curl
  • github:
  • https://github.com/nktnet1/sync-request-curl
  • 该库包含原始
sync-request

中功能的子集,但利用 node-libcurl 以获得更好的性能和 NodeJS 的附加 libcurl 选项。 这是 GET 请求的基本用例:

// import request from 'sync-request-curl'; const request = require('sync-request-curl'); const response = request('GET', 'https://ipinfo.io/json'); console.log('Status Code:', response.statusCode); console.log('body:', response.body.toString());

请查阅文档以获取更多示例。

具体到你的情况,你可以重写如下:

const request = require('sync-request-curl'); function getAllPosts(responseObj, masterPosts) { masterPosts = masterPosts ?? { data: [] }; masterPosts.data.push(...responseObj.data); if (responseObj.paging?.next) { const response = request('GET', responseObj.paging.next); const nextResponse = JSON.parse(response.body.toString()); getAllPosts(nextResponse, masterPosts); } return masterPosts; }

希望这有帮助:)。

© www.soinside.com 2019 - 2024. All rights reserved.