我有幾個資料庫突變,我想一次全部執行,而不是同步執行。我遇到的問題是,當我嘗試將這些承諾推送到陣列中時,它們會執行。
我在這里做錯了什么?我也試過推送匿名函式,像這樣,
promises.push(
async () => await someDbMutation1({ someForeignKey: "10" }),
)
但它們不會在Promise.all.
import * as React from "react";
import "./styles.css";
const someDbMutation1 = async ({ someForeignKey }) => {
return await new Promise((resolve) => {
console.log("should not enter");
return setTimeout(() => {
resolve("aa");
}, 2000);
});
};
const someDbMutation2 = async ({ someParameter }) =>
await new Promise((resolve) =>
setTimeout(() => {
resolve();
}, 2000)
);
export default function App() {
const [loaded, setLoaded] = React.useState(false);
React.useEffect(() => {
init();
}, []);
const init = React.useCallback(async () => {
const promises = [
someDbMutation1({ someForeignKey: "10" }),
someDbMutation2({ someParameter: "abc" })
];
// await Promise.all(promises);
setLoaded(true);
}, []);
return <div className="App">{loaded && <div>done</div>}</div>;
}
我希望promises在呼叫 期間執行陣列中的這些承諾Promise.all,但顯然情況并非如此。我最近才注意到這一點,當我null作為一個值傳遞給一個外鍵時,此時我的資料庫中的鍵約束將它撿起來并拋出一個錯誤。
現在我很擔心,因為我經常使用promises陣列并回圈遍歷 db 物件和push變異查詢promises——這意味著,每個請求都會執行兩次!我不確定我在這里錯過了什么。
uj5u.com熱心網友回復:
對于問題的第一部分,您說它沒有執行:
promises.push(
async () => await someDbMutation1({ someForeignKey: "10" }),
)
這是因為您正在推送一個匿名函式而不是承諾 - 它們是兩種不同的東西。根據您的陣列名稱,我認為您應該這樣做:
promises.push(
someDbMutation1({ someForeignKey: "10" })
)
如果您希望在一個時間點執行所有承諾,那么您可以這樣做:
queries.push(
async () => await someDbMutation1({ someForeignKey: "10" }),
)
/ ** -- some point later -- ** /
const promises = queries.map(q => q()) // Execute queries
const results = await Promise.all(promises) // Wait for queries to finish
此外,您對Promise.all此處的作業方式有誤解:
我希望在呼叫 Promise.all 期間執行 promises 陣列中的這些承諾
Promise.all不執行承諾,它等待承諾解決。這里有一個參考。
所以在這部分:
const promises = [
someDbMutation1({ someForeignKey: "10" }),
someDbMutation2({ someParameter: "abc" })
];
您實際上是在執行這些函式,因此如果您訪問console.logpromises 陣列,它看起來像這樣:
[
Promise (unresolved),
Promise (unresolved)
];
然后在 之后await Promise.all(),promises陣列將如下所示:
[
Promise (resolved: value),
Promise (resolved: value)
];
uj5u.com熱心網友回復:
問題 1:Promise 必須在實際等待它們的塊中等待。
const someDbMutation1 = async ({ someForeignKey }) => {
return new Promise((resolve) => {
console.log("should not enter");
return setTimeout(() => {
resolve("aa");
}, 2000);
});
};
const someDbMutation2 = async ({ someParameter }) =>
await new Promise((resolve) =>
setTimeout(() => {
resolve();
}, 2000)
);
問題是你正在執行承諾。您應該將它們作為匿名函式添加到陣列中,這些函式使用您想要的引數呼叫您的函式。所以這應該是這樣的。:
const init = React.useCallback(async () => {
const promises = [
async () => someDbMutation1({ someForeignKey: "10" }),
async () => someDbMutation2({ someParameter: "abc" })
];
await Promise.all(promises);
setLoaded(true);
}, []);
我希望這是您正在尋找的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/383575.html
標籤:javascript 反应
下一篇:正則運算式忽略負前瞻
