代码之家  ›  专栏  ›  技术社区  ›  Tim

为什么我的jquery对话框使用延迟而不等待用户选择?

  •  0
  • Tim  · 技术社区  · 6 年前

    我有以下函数,它创建一个对话框,并使用jquery deferred等待用户响应:

    function myPageUnsaved() {
        var defer = $.Deferred();
        $('<div></div>')
        .html('You have unsaved changes. Leave this page and lose your changes?')
        .dialog({
            autoOpen: true,
            modal: true,
            title: 'Confirmation',
            buttons: {
                "No": function () {
                    defer.resolve("false");
                    $(this).dialog("close");
                 },
                 "Yes": function () {
                    defer.resolve("true");
                    $(this).dialog("close");
                 }
            },
            close: function () {
                $(this).dialog('destroy').remove();
            }
        });
        return defer.promise();
    }
    

    我调用下面JS中的函数:

    // function to check for user changes prior to navigating to a new page
    function checkPageChange() {
        if (pageChanges == true) {
            myPageUnsaved().then(function (answer) {
                // if user answered no, stay on the page
                if(answer == 'false') {
                    return false;
                // else the user answered yes, so leave the page
                } else {
                    return true;
                }
            });
    
        } else {
            return true;
        }
    }   
    

    我正在运行jquery 1.11。

    对话框将显示给用户,但会立即删除。我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Chris Rymer    6 年前

    使用的模式似乎是正确的,我的初始答案是错误的。.Promise是一种延迟的方法,所有成员方法都可以在这里看到。 http://api.jquery.com/category/deferred-object/

    原始海报提供的代码示例,似乎在jfiddle中有效

    https://jsfiddle.net/n7ewqfc0/


    初始答案-错误的计算

    你刚才试过把 defer 而不是推迟承诺;这对我来说似乎不合适。

    查看规格 Deferred 没有提到 promise 方法。 https://api.jquery.com/jquery.deferred/

    显然,我已经大大简化了您的代码以提供解决方案,但原则是相同的。你必须归还承诺对象,即 推迟 能够使用基于承诺的回调 .then 等。

    function myPageUnsaved() {
        var defer = $.Deferred();
        setTimeout(function(){
            defer.resolve('hey back from inside the promise')
        }, 2000)
        return defer;
    }
    
    var p = myPageUnsaved()
    p.then(function(response){
      console.log(response)
    })