
async 函数总是返回 Promise 对象,直接 console.log 调用结果只会显示 Promise { pending };必须使用 .then() 链式调用或在 async 上下文中用 await 等待解析后才能获取最终值。
async 函数总是返回 promise 对象,直接 console.log 调用结果只会显示 `promise { pending }`;必须使用 `.then()` 链式调用或在 async 上下文中用 `await` 等待解析后才能获取最终值。
在你的代码中,dogarden() 是一个 async 函数,因此它隐式返回一个 Promise —— 即使函数体内使用了 await 和 return result,其返回值仍会被自动包装为 Promise.resolve(result)。这就是为什么 console.log(a) 输出 Promise { pending } 的根本原因:你打印的是 Promise 实例本身,而非它 resolve 后的值。
✅ 正确做法一:使用 .then()(推荐用于顶层非 async 环境)
const a = dogarden(isGrassTrimmerFound, isWaterHosePipeFound);
a.then(result => {
console.log(result); // ['Grass Trimmed', 'Garden Cleaned', 'Watered Plants']
}).catch(error => {
console.error(error);
});
? 注意:务必传入参数 isGrassTrimmerFound 和 isWaterHosePipeFound,否则 dogarden() 内部逻辑将因 undefined 导致不可预期行为(如 JSON.parse(undefined) 报错)。
✅ 正确做法二:使用 await(需在 async 函数内)
由于 main() 当前是普通函数,不能直接 await,需将其改为 async:
async function main() {
const isGrassTrimmerFound = JSON.parse(readLine());
const isWaterHosePipeFound = JSON.parse(readLine());
async function dogarden(isGrassTrimmerFound, isWaterHosePipeFound) {
try {
const cutgrass = new Promise((resolve, reject) => {
if (isGrassTrimmerFound) resolve("Grass Trimmed");
else reject("Grass Trimmer Not Found");
});
const cleangarden = Promise.resolve("Garden Cleaned"); // 更简洁写法
const waterplant = new Promise((resolve, reject) => {
if (isWaterHosePipeFound) resolve("Watered Plants");
else reject("Water Hose Pipe Not Found");
});
const result = await Promise.all([cutgrass, cleangarden, waterplant]);
return result;
} catch (error) {
throw error;
}
}
try {
const a = await dogarden(isGrassTrimmerFound, isWaterHosePipeFound);
console.log(a); // ✅ 此时输出为数组:["Grass Trimmed", "Garden Cleaned", "Watered Plants"]
} catch (error) {
console.error(error);
}
}
⚠️ 关键注意事项:
- await 只能在 async 函数内部使用;
- Promise.all([]) 按传入顺序返回结果,确保 cutgrass → cleangarden → waterplant 的输出顺序与预期一致;
- 若任一 Promise reject(如工具缺失),整个 Promise.all 将立即 reject,需用 try/catch 捕获;
- 不要忽略参数传递:dogarden() 必须接收 isGrassTrimmerFound 和 isWaterHosePipeFound,否则逻辑失效。
✨ 进阶建议:
若希望逐个执行(而非并发)、并按严格顺序输出每一步结果,可改用 await 串行调用:
const step1 = await cutgrass; // "Grass Trimmed" console.log(step1); const step2 = await cleangarden; // "Garden Cleaned" console.log(step2); const step3 = await waterplant; // "Watered Plants" console.log(step3);
掌握 Promise 生命周期与 async/await 的配合,是写出可维护、可调试异步代码的基础。











