Рекурсивная функция в Redux / Thunk, возвращающая объект Promise, а не обычный объект - PullRequest
0 голосов
/ 19 марта 2019

Я вызываю функцию от создателя действия:

getPostComments(author, permlink) .then(comments => {...

Эта функция также вызывается рекурсивно для получения всех вложенных комментариев:

const getPostComments = (author, permlink) => {
  return client.database.call('get_content_replies', [author, permlink])
    .then(replies => {
      return replies.map(r => {
        if (r.children > 0) {
          return getPostComments(r.author, r.permlink)
            .then(children => children)
            .then(unpromised => {
              r.replies = unpromised
              return r;
            })
        }else {
          return r;
        }
      });
    });
}

Проблема в том, что первый вызов возвращается с объектом Promise.Например, на странице есть 3 комментария, и один из них имеет вложенный комментарий.Комментарии без вложенных комментариев возвращают объект комментария, а комментарий с вложенностью возвращает объект Promise.

enter image description here

enter image description here

0: комментарий с комментарием.1: только комментарий.2: только комментарий.

Вложенный комментарий внутри него (0 :) возвращается как обычный объект, так как я делаю .then(unpromised => { для него, чтобы разрешить рекурсивный вызов getPostComments.

enter image description here

Но первый вызов getPostComments - это объект Promise (как показано на первых двух изображениях), и я хочу обычный объект данных,не объект Promise.

Как сделать его обычным объектом?Что не так?

Спасибо!

1 Ответ

2 голосов
/ 19 марта 2019

Похоже, ваша проблема только в том, что вы не ожидаете разрешения обещаний map. Promise.all должен исправить это, я думаю (не проверено).

const getPostComments = (author, permlink) => {
  return client.database.call('get_content_replies', [author, permlink])
    .then(replies => Promise.all(replies.map(r => {
      if (r.children > 0) {
        return getPostComments(r.author, r.permlink)
          .then(comments => {
            r.replies = comments
            return r;
          })
      } else {
        return r;
      }
    })));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...