prom.resolve () в течение l oop возврат неопределен - PullRequest
0 голосов
/ 28 апреля 2020

Я пытался получить узел дерева после процесса поиска. Но это всегда возвращает неопределенное .. вот код.

const findOrder = (list, key) =>
  new Promise((resolve) => {
    for (let i = 0; i < list.length; i++) {
      // find node through key in tree
      if (list[i].key === key) {
        console.log(`================I got it!: `, list[i].children); // children[]
        resolve(list[i].children);
      }
      if (list[i].children) {
        findOrder(list[i].children, key);
      }
    }
  });

const setOrder = async() => {
  const orders = await findOrder(
    treeData,
    dropObj.classKind === "1" ? keyGen(dropObj.key) : dropObj.key
  );
  console.log(`==================siblings: `, orders); // undefined
};
setOrder();

в чем проблема?

1 Ответ

1 голос
/ 28 апреля 2020

Вы не разрешили это здесь,

      // ...
      if (list[i].children) {
        findOrder(list[i].children, key);
      }
      // ...

Чтобы сообщить внешнему Обещанию, когда разрешать это, вы должны явно сделать это:

      // ...
      if (list[i].children) {
        findOrder(list[i].children, key).then(result => {
          // as resolve can only be called once,
          // do not call it if it doesn't found anything
          if (result) resolve(result)
        });
      }
      // ...

Это должно работать. Однако в этой реализации слишком много бесполезных вызовов для «разрешения». Лучше найти соответствующий элемент напрямую и разрешить его.

Вот пример:

const findOrder = function (list, key) {
  return new Promise((resolve, reject) => {
    resolve(find(list, key))

    function find (_list, key) {
      for (let i = 0; i < _list.length; i++) {
        if (_list[i].key === key) return _list[i].children
        if (_list[i].children) {
          const c = find(_list[i].children, key)  
          if (c) return c
        }
      }
      return undefined
    }
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...