JavaScript异步函数返回值方法及VS Code扩展中异步用户输入值的外部使用方案
问题1:如何在JavaScript中从异步函数返回值?
异步函数(用async关键字声明的函数)本质上会返回一个Promise,而非你在函数内return的原始值。要拿到实际返回值,有两种常用方式:
- 使用
async/await语法:在另一个async函数中,用await等待异步函数的Promise完成 - 使用Promise的
.then()方法:直接链式调用处理异步函数返回的Promise
举个简单的示例:
// 定义一个异步函数 async function fetchData() { // 模拟异步操作(比如API请求) await new Promise(resolve => setTimeout(resolve, 1000)); return "异步操作完成啦!"; } // 方式1:用async/await获取返回值 async function getValueWithAwait() { const result = await fetchData(); console.log(result); // 输出 "异步操作完成啦!" } // 方式2:用.then()获取返回值 fetchData().then(result => { console.log(result); // 输出 "异步操作完成啦!" });
注意:await只能在async函数内部使用,如果是在非异步上下文里调用异步函数,只能用.then()来处理返回值。
问题2:将VS Code扩展的终端命令逻辑移至异步函数外部的实现思路
把「获取用户输入」和「执行终端命令」解耦是个很好的思路,能让代码更易维护。因为你的输入函数是异步的,它会返回一个Promise,我们可以利用这一点把收集到的分支名称传递给单独的命令执行函数,具体步骤如下:
步骤1:重构输入函数,让它返回收集到的分支值
不再在输入函数里执行终端命令,而是返回用户输入的分支名称(如果用户取消输入则返回null):
async function getBranchInputs() { const destBranch = await vscode.window.showInputBox({ placeHolder: 'Insert the name of the destination branch' }); const devBranch = await vscode.window.showInputBox({ placeHolder: 'Insert the name of the Developing branch' }); // 处理用户取消输入的情况(showInputBox会返回undefined) if (!destBranch || !devBranch) { return null; } return { destBranch, devBranch }; }
步骤2:创建单独的终端命令执行函数
这个函数接收分支名称作为参数,专门负责创建终端并执行Git命令:
function executeGitCommands(destBranch, devBranch) { const term = vscode.window.createTerminal("gitTerminal"); term.show(); // 用模板字符串替代字符串拼接,代码更简洁 term.sendText(`git switch ${destBranch}`); term.sendText(`git checkout ${devBranch} file.txt`); term.sendText('git add .'); term.sendText('git commit -m "tests"'); }
步骤3:整合逻辑,完成工作流
用async/await获取输入值,确认有效后调用命令执行函数:
async function runWorkflow() { const branchInputs = await getBranchInputs(); if (branchInputs) { const { destBranch, devBranch } = branchInputs; executeGitCommands(destBranch, devBranch); } else { // 可选:提示用户输入已取消 vscode.window.showInformationMessage('分支输入已取消,未执行任何命令。'); } } // 启动工作流 runWorkflow();
额外优化建议:
- 输入校验:可以在
getBranchInputs里添加空值校验,如果用户输入空字符串,弹出错误提示让用户重新输入 - 错误处理:如果需要捕获Git命令的执行错误,可以在终端相关逻辑里添加错误处理(不过VS Code终端会原生展示错误信息)
- 复用性:现在
getBranchInputs和executeGitCommands可以独立在扩展的其他地方调用,提升代码复用率
内容的提问来源于stack exchange,提问作者mariniou77
相关产品推荐
相关产品推荐

