【问题标题】:Why is my jQuery dialog using Deferred not waiting for user selection?为什么我使用 Deferred 的 jQuery 对话框不等待用户选择?
【发布时间】:2018-07-30 13:47:09
【问题描述】:

我有以下函数创建一个对话框并使用 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。

对话框呈现给用户,但立即被删除。我错过了什么?

【问题讨论】:

  • 我认为首先您需要使用此处提供的最新版本升级您的 jQuery 版本jquery.com/download
  • 我可以调查一下,但在 1.11 中支持 Deferred。

标签: javascript jquery jquery-deferred


【解决方案1】:

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

原始海报提供的代码示例似乎可以在 jsfiddle 中使用

https://jsfiddle.net/n7ewqfc0/


初步答案 - 错误假设

您是否尝试过只返回 defer 而不是 defer.promise();这对我来说似乎不对。

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

显然,我已经大大简化了您的代码以提供解决 Promise,但原理是相同的。您必须返回承诺对象,即 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)
})

【讨论】:

  • 我从创建小提琴中看到defer.promisedefer 的工作方式相同。我应该先检查一下。你能把整个瘦成一个jsfiddle吗?
  • 快速尝试复制您的代码,它似乎确实有效。 jsfiddle.net/n7ewqfc0
  • 谢谢克里斯。我很高兴它对你有用。所以我的代码中的其他东西可能会阻止它。当我调试它时,它拒绝保持。
  • 是的,听起来像是完整代码中的一个问题。如果可以的话,分享jsfiddle,一定有充分的理由。如果您无法使用 devtools 设置断点,请在要分析的位置尝试使用 debugger 关键字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多