如何在WinJS中实现确认对话框并返回用户的选择

mun*_*der 2 microsoft-metro winjs

使用WinJS我试图向刚刚按下"继续"按钮的用户显示一条消息,表示他们没有回答问题.这会显示一个带有两个按钮的对话框(Windows.UI.Popups.MessageDialog),允许用户选择现在回答它(因此保留在无人接听的问题上)或稍后回答(因此直接进入下一个问题) .在Javascript中,我通常可以使用一个确认对话框,它会暂停执行直到用户做出选择,然后我可以使用返回的值来决定是否显示下一个问题.在WinJS中,代码执行不会停止.这是我显示对话框的功能:

function doSillyMessage(message, title) {
    var messagedialogpopup = new Windows.UI.Popups.MessageDialog(message, title);
    // Add commands and set their CommandIds
    messagedialogpopup.commands.append(new Windows.UI.Popups.UICommand("Answer now", null, 1));
    messagedialogpopup.commands.append(new Windows.UI.Popups.UICommand("Answer later", null, 2));

    // Set the command that will be invoked by default
    messagedialogpopup.defaultCommandIndex = 0;

    // Show the message dialog
    messagedialogpopup.showAsync().done(function (command) {
        if (command) {
            if (command.id == 1) {
                console.log('proceed in popup is false');
                proceed = false;
            }
            else if (command.id == 2) {
                console.log('proceed in popup is true');
                proceed = true;
            }

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

问题是,在调用doSillyMessage的时候,代码不会等待,因此无论"proceed"变量的当前值是什么,都会继续.例如,如果在调用doSillyMessage时'proceed'的值为false,则在调用doSillyMessage之后它也是false,并且只有在稍后,当我在控制台中看到'继续'时,它才会更改为true(如果适用)弹出是真的'.如何以正确的顺序执行此操作?

Chr*_*res 5

对话是异步的; 你需要等待一个承诺,以便延迟到用户处理输入.

最简单的方法是从调用showAsync返回promise.改变这个:

messagedialogpopup.showAsync().done(function (command) {
Run Code Online (Sandbox Code Playgroud)

return messagedialogpopup.showAsync().then(function (command) {
   if (command) {
        if (command.id == 1) {
            console.log('proceed in popup is false');
            return false;
        }
        else if (command.id == 2) {
            console.log('proceed in popup is true');
            return true;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

并将对doSillyMessage的调用更改为:

doSillyMessage().then(function (proceed) {
    // proceed will be true or false
});
Run Code Online (Sandbox Code Playgroud)

你的回调逻辑中有一些漏洞; 如果没有设置命令,或者它不是1或2,你会返回什么?