【发布时间】:2023-03-08 04:13:01
【问题描述】:
当我尝试从异步函数返回 Promise 时,无法区分返回的 Promise 和函数的状态。
我认为,最简单的解决方案是将要返回的承诺放在一个数组中。以下是一个愚蠢的例子,但我希望它能说明问题:
function loadMetaData(id) {/*...*/} // Returns Promise<MetaData>
function loadSingleData(name) {/*...*/} // Returns Promise<SingleData>
async function startLoadingSingleData(id, object) {
const metaData = object.metaData = await loadMetadata(id);
const singleDataPromise = loadSingleData(metaData.dataToLoad);
singleDataPromise.then(metaData => object.metaData = metaData);
return [singleDataPromise];
}
async function logData(id) {
const object = new SomeUsefulClassWhatTakesAdvantageOfMetadataProp();
somePromise = (await startLoadingSingleData(id))[0];
// Now metadata surely loaded, do something with it
console.log(object.metaData);
// But somedata will be loaded only in future
somePromise.then(singleData => console.log(singleData));
// And maybe: (depends of use-case)
await somePromise;
}
在执行logData(/*...*/)时,首先是给定数据的给定ID的metaData,稍等片刻后,预计会出现完整的singleData。
但这有点骇人听闻。
克服这种情况的预期方法是什么?
PS: 当我尝试返回一个通过 Promise 解决的 Promise 时,也会出现此问题。
【问题讨论】:
-
“无法区分返回的 Promise 和函数的状态”——我不明白你的意思。
-
“最简单的解决方案是将要返回的 Promise 放在一个数组中”——异步函数必须返回一个 Promise,而不是一个数组,即使该数组包含一个 Promise。
-
异步函数自动返回一个 Promise。无论您从异步函数返回什么值,都将自动包装在 Promise 中。如果你真的做
async function() { return new Promise(...) },你实际上是在返回一个Promise of a Promise。除非这是您需要的,否则您不需要自己创建承诺,只需返回您的值。 -
谢谢大家,更新了。我希望现在这可以澄清返回承诺的必要性,以及我的意思。