我正试图在studentDataPromise
之前获取fetchLoansPromise
,因为它取决于studentDataPromise
返回的数据。
这是我当前的代码:
Promise.all([studentDataPromise, fetchclassesPromise, fetchLoansPromise])
.then(() => {
toggleIsReady();
})
.catch(error => {
throw new Error(error);
});
这是事件的当前顺序:
toggleIsReady
最初设置为false,但现在为true。 fetchLoansPromise
-无法获取,没有获取studentDataPromise
studentDataPromise
-正确获取toggleIsReady
-现在设置为false fetchclassesPromise
-正确获取有什么建议吗?
答案 0 :(得分:0)
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()
非常适合当您想要确保在所有诺言(您通过的诺言)得到解决后发生的事情。
希望这会有所帮助
答案 1 :(得分:0)
在其他答辩之前先致电studentDataPromise
。
studentDataPromise().then((data) => {
Promise.all([fetchclassesPromise, fetchLoansPromise])
})
答案 2 :(得分:0)
您可以做类似
的操作Promise.all([studentDataPromise, fetchclassesPromise])
.then(([studentData, classesData]) => fetchLoans(studentData))
.then(() => toggleIsReady())
.catch(error => {
// handle exception
});
或使用异步等待:
try {
const [studentData, classesData] = await Promise.all([studentDataPromise, fetchclassesPromise]);
const loansData = await fetchLoans(studentData);
toggleIsRead();
} catch (e) {
// handle exception
}
fetchLoans
将返回fetchLoansPromise
的地方。
答案 3 :(得分:0)
这就是我解决的方法,现在在解决“ fetchLoansPromise”之前先解决“ fetchStudentData”。
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);
});
谢谢大家