Nodejs-递归函数未在成功的请求调用中被调用

时间:2019-06-17 11:39:25

标签: javascript node.js recursion request

我有一个对象数组。对于数组的每个元素,我都需要发出POST请求。 POST请求成功后,我需要获取该元素的子对象并重复该过程。我使用递归函数调用

实现了此功能
  • roottypeid
    • type1
      • type11
        • type111
      • type12
    • type2
      • type21
      • type22

这是需要遵循的层次结构。仅创建第一级,即type1和type2。为什么未为子对象调用递归函数?

function func1(typeid) {
  getTypes(typeid).then(function(responseData) { //getTypes returns all the child types of a given parent typeid
    var types = JSON.parse(responseData);

    AuthClient.credentials.getToken()
      .then(function(token) {
        types.forEach(function(element) {

          var options = {
            method: 'POST',
            url: url,
            qs: {
              access_token: token.accessToken
            },
            headers: {
              'content-type': 'application/json'
            },
            body: element,
            json: true
          }
          request(options, function(error, response, body) {
            if (error) throw new Error(error)
            if (response.statuscode === 200) {
              func1(element.id);
              console.log(body);
            }
          });
        });
      })
      .catch(function(err) {
        console.log(err);
      });
  });
}

func1(roottypeid);

1 个答案:

答案 0 :(得分:0)

我认为您提供的代码中没有错误;绝对不是递归错误。通过伪造您正在调用的服务,我可以使其与您的确切代码一起使用。

仔细检查是否有错字,例如错别字。 (您的服务返回statuscode还是statusCode吗?)

const AuthClient = {credentials: {getToken: () =>
  Promise.resolve({accessToken: 'foobar'})
}}

const getTypes = (typeid) => 
  new Promise((resolve, _) => resolve(({
      roottypeid: `[{"id": "type1"}, {"id": "type2"}]`,
      type1: `[{"id": "type11"}, {"id": "type12"}]`,
      type11: `[{"id": "type111"}]`,
      type2: `[{"id": "type21"}, {"id": "type22"}]`
    })[typeid] || `[]`)
  )

const request = (options, fn) => setTimeout(
  () => fn (
    null, 
    {statuscode: 200}, 
    `fake results for ${JSON.stringify(options.body)}`
  ),
  10
)

const url = 'http://example.com'

const roottypeid = 'roottypeid'

function func1(typeid) {
  getTypes(typeid).then(function(responseData) { //getTypes returns all the child types of a given parent typeid
    var types = JSON.parse(responseData);

    AuthClient.credentials.getToken()
      .then(function(token) {
        types.forEach(function(element) {

          var options = {
            method: 'POST',
            url: url,
            qs: {
              access_token: token.accessToken
            },
            headers: {
              'content-type': 'application/json'
            },
            body: element,
            json: true
          }
          request(options, function(error, response, body) {
            if (error) throw new Error(error)
            if (response.statuscode === 200) {
              func1(element.id);
              console.log(body);
            }
          });
        });
      })
      .catch(function(err) {
        console.log(err);
      });
  });
}

func1(roottypeid);