首页 > 解决方案 > 异步/等待:不等待对话框关闭

问题描述

我正在使用vscode.window.showOpenDialog. 它显示一个用于选择目录的对话框 (Windows)。除了 async/await 之外,代码都可以工作。它不等待对话框关闭。如何让函数 getDirectory 等待函数 showDialog 解析所选目录?

函数 getDirectory 立即输出日志 #1,无需等待函数 showDialog。此时dir为空。正如预期的那样,function showDialog()在对话框关闭后记录 #2。


扩展名.ts

async function getDirectory(): Promise<void> {
    const dir = await showDialog();
    console.log("#1: " + String(dir)); //Outputs before dialog is closed.
}

function showDialog() {
    let dir = "";
    const options: vscode.OpenDialogOptions = {
        canSelectMany: false,
        openLabel: 'Select',
        canSelectFiles: false,
        canSelectFolders: true
    };
    vscode.window.showOpenDialog(options).then(fileUri => {
        if (fileUri && fileUri[0]) {
            console.log('#2: ' + fileUri[0].fsPath); //Outputs when dialog is closed.
            dir = String(fileUri[0].fsPath);
        }
    });
    return Promise.resolve(dir);
}

控制台

#1:
#2: c:\Path\To\Chosen\Directory

标签: typescriptvisual-studio-codevscode-extensions

解决方案


function getDirectory(){
return new Promise(async (resolve,reject)=>{
  const dir = await showDialog();
  console.log("#1: " + String(dir)); //Outputs before dialog is closed.
})
   
}

function showDialog() {
    let dir = "";
    const options: vscode.OpenDialogOptions = {
        canSelectMany: false,
        openLabel: 'Select',
        canSelectFiles: false,
        canSelectFolders: true
    };
    vscode.window.showOpenDialog(options).then(fileUri => {
        if (fileUri && fileUri[0]) {
            console.log('#2: ' + fileUri[0].fsPath); //Outputs when dialog is closed.
            dir = String(fileUri[0].fsPath);
        }
    });
    return Promise.resolve(dir);
}

推荐阅读