Обещание не разрешить значение при возврате - PullRequest
0 голосов
/ 26 марта 2019

У меня есть рекурсивная функция, которая рекурсивно разрешает сопоставленный массив.

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

Но когда я добавил еще одну выборку данных, возврат от then остается обещанием:

const postCommentsRecursive = (author, permlink) => {
  return client.database.call('get_content_replies', [author, permlink])
    .then(replies => Promise.all(replies.map(r => {
//NEW CODE START
      const votes = client.database
        .call('get_active_votes', [r.author, r.permlink])
        .then(av => {
          return av;
        });
      r['active_votes'] = votes;
//NEW CODE END
      if (r.children > 0) {
        return postCommentsRecursive(r.author, r.permlink)
          .then(children => {
            r.replies = children;
            return r;
          })
      }else {
        return r;
      }
    })))
}

av - значение массива, отлично. Но когда я добавляю его к объекту из votes, вместо него появляется Promise.

Каждый дочерний объект replies все еще разрешается как значение, но внутри каждого r, когда я добавляю votes к r как r['active_votes'] = votes, значение, установленное в объекте, равно Promise {<resolved>: Array(1)}.

enter image description here

Я не могу понять, как получить фактическое Array(1) в качестве значения, а не Promise в качестве значения. Как мне получить Array в качестве значения, а не Promise?

Спасибо!

1 Ответ

1 голос
/ 26 марта 2019

В вашем коде вы присваиваете r.votes как Promise. Вместо этого вам нужно перейти к .then этого обещания, если вы хотите изменить r. (Концептуально, это то же самое, что вы делаете в блоке r.children > 0)

      return client.database
        .call('get_active_votes', [r.author, r.permlink])
        .then(av => {
          // mutate r
          r.active_votes = av;
          // now return it so that this entire promise resolves with `r`
          return r;
        });

async/await обычно делает код, подобный этому, немного понятнее:

r.active_votes = await client.database
        .call('get_active_votes', [r.author, r.permlink])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...