我試圖了解有關以下承諾行為的一些資訊。
當我對陣列push作出承諾時,就會執行。我認為這是因為作為我,我實際上執行了承諾。promisesconsole.logpush
但是當我嘗試這樣做時Promise.all,我看不到console.log正在列印相同的訊息,這只是沉默。resolve如果我從Promise.all和它們中解構它們,我可以看到它們的回傳值console.log,但是,我再一次看不到console.log訊息(例如Printed for promise A during push)。
為什么會這樣?
import * as React from "react";
const promiseA = async ({}) => {
return await new Promise((resolve) => {
console.log("Printed for promise A during push");
resolve("promise a resolved");
});
};
const promiseB = async ({}) => {
return await new Promise((resolve) => {
console.log("Printed for promise B during push");
resolve("promise b resolved");
});
};
const Component = React.memo(() => {
React.useEffect(() => {
init();
}, []);
const init = React.useCallback(async () => {
let promises = [];
promises.push(promiseA({})); // 'Printed for promise A during push'
promises.push(promiseB({})); // 'Printed for promise B during push'
await Promise.all(promises); // silence, nothing is printed
/*
// And if I do the following, I see the strings in `resolve`:
const [responseA, responseB] = await Promise.all(promises);
console.log("responseA", responseA); // responseA promise a resolved
console.log("responseB", responseB); // responseB promise a resolved
*/
}, []);
return <div />;
});
export default Component;
uj5u.com熱心網友回復:
這里的一些混亂是你的命名。
promiseA并且promiseB不是代碼中的承諾,它們是回傳 a 的函式Promise。
您呼叫函式promiseA和promiseB,并將回傳值添加到陣列中。
使用函式的回傳值不會再次呼叫該函式。回傳的 promise 物件可用于等待函式中的代碼完成。在這種情況下,它們不是異步的,因此它們將立即被決議/完成。
Promise.all回傳一個新的 Promise,當陣列中的所有 Promise 都已解決時,該 Promise 已解決。在這種情況下,這又是立即。
但是,不要將呼叫的函式promise與回傳值混淆,回傳值實際上是Promise
uj5u.com熱心網友回復:
承諾不能“執行”。Promise 不描述動作,它們描述一些動作的結果。
當建構式被呼叫時,你傳遞給Promise建構式的函式會立即被呼叫。它的作業是啟動行動,承諾所代表的結果。這意味著在創建承諾時啟動操作。
new Promise((resolve) => {
console.log("Printed during promise creation");
resolve("resolved");
});
……和寫作一樣……
console.log("Printed at the same time, but from outside the Promise callback");
new Promise((resolve) => {
resolve("resolved");
});
因此,在您的代碼中,它并沒有push 創建那些承諾。是你在呼叫那些創建承諾的函式。
promises.push( promiseA({}) );
// ^^^^--- calling function `promiseA`
你做你的函式的東西async可能是另一個層次的混亂。讓我們以更清晰的方式重寫您的代碼:
//This used to be named `promiseA`
const createPromiseA = () => {
console.log("Called createPromiseA, about to create promiseA")
return new Promise((resolve) => {
console.log("Promise A created");
resolve("Promise A resolved");
});
};
//This used to be named `promiseB`
const createPromiseB = () => {
console.log("Called createPromiseB, about to create promiseB")
return new Promise((resolve) => {
console.log("Promise B created");
resolve("Promise B resolved");
});
};
let promises = [];
let promiseA = createPromiseA(); //Called createPromiseA, about to create promiseA | Created promiseA
let promiseB = createPromiseB(); //Called createPromiseB, about to create promiseB | Created promiseB
//All the following will just move those promises around, no logs.
promises.push(promiseA);
promises.push(promiseB);
//Neither will this log
let results = await Promise.all(promises);
//Logs the results as expected
console.log(results) //["Promise A resolved", "Promise B resolved"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420413.html
標籤:
