Reactjs обещание. Все порядок звонков - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь получить studentDataPromise до fetchLoansPromise, поскольку это зависит от данных, возвращаемых studentDataPromise.

Это мой текущий код:

Promise.all([studentDataPromise, fetchclassesPromise, fetchLoansPromise])
        .then(() => {
            toggleIsReady();
        })
        .catch(error => {
            throw new Error(error);
        });

Этотекущий порядок событий:

  1. toggleIsReady изначально установлен в значение false, но теперь имеет значение true.
  2. fetchLoansPromise - не удается получить, у него нет studentDataPromise выбранных
  3. studentDataPromise - выбирает его правильно
  4. toggleIsReady - теперь установленов false
  5. fetchclassesPromise - выбирает правильно

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 03 апреля 2019

Вот как я это решил, теперь «fetchStudentData» разрешается до «fetchLoansPromise».

    let studentDataPromise = null;
    let fetchClassesPromise = null;
    let fetchLoansPromise = null;
    useEffect(() => {
        studentDataPromise = fetchStudentData();
    }, []);

    useEffect(() => {
        fetchClassesPromise = fetchClasses();
    }, []);

    useEffect(() => {
        fetchLoansPromise = resolveStudentDataPromise();
    }, []);
    async function resolveStudentDataPromise() {
        await Promise.all([studentDataPromise]);
        fetchLoans();
    }

    Promise.all([studentDataPromise, fetchClassesPromise, fetchLoansPromise])
        .then(() => {
            toggleIsReady();
        })
        .catch(error => {
            throw new Error(error);
        });

Спасибо всем

0 голосов
/ 02 апреля 2019

Позвоните studentDataPromise перед другими обещаниями.

studentDataPromise().then((data) => {
  Promise.all([fetchclassesPromise, fetchLoansPromise])
})
0 голосов
/ 02 апреля 2019

Вы можете сделать что-то вроде

Promise.all([studentDataPromise, fetchclassesPromise])
    .then(([studentData, classesData]) => fetchLoans(studentData))
    .then(() => toggleIsReady())
    .catch(error => {
        // handle exception
    });

Или использовать async await:

try {
    const [studentData, classesData] = await Promise.all([studentDataPromise, fetchclassesPromise]);
    const loansData = await fetchLoans(studentData);
    toggleIsRead();
} catch (e) {
    // handle exception
}

Где fetchLoans вернет fetchLoansPromise.

0 голосов
/ 02 апреля 2019

Promise.all() выполняется, когда все обещания, которые вы передаете в разрешении.Это означает, что у вас нет гарантии, что ваш studentDataPromise будет решен до fetchLoanPromise.Я рекомендую взглянуть сюда Promise.all

Самый простой способ - использовать .then() после разрешения обещания.Это может выглядеть так:

let studentDataPromise = new Promise((resolve, reject) => {
  /**
   * 
   * 
   * **/
   reject(/**Something goes here**/)

  /**
   * Some Code here
   * 
   */
  resolve(/**Something goes here**/)

})

studentDataPromise
  .then((/**Whatever you return from resolve()**/) => {
    // Here you can call your fetchLoansPromise
    fetchLoansPromise
      .then(() => {
        /*** ***/
      })
  })

Или даже более элегантно с использованием async/await:

let studentDataPromise = () => {
  return new Promise((resolve, reject) => {

    /**
     * 
     * **/

     resolve()

  })
}


let someAsyncFunction = async () => {
  try {
    let studentData = await studentDataPromise()
    // Here you are guaranteed that your promise resolved
    // And you can call your other function
  }
  catch (err) {
  }
}

В любом случае вы должны убедиться, что ваше первое обещание выполнено, а затемВы можете ваши другие функции.Promise.all() замечательно, когда вы хотите убедиться, что что-то происходит после того, как все ваши обещания (которые вы передаете) будут выполнены.Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...