【问题标题】:Ajax promises with a parent/child function带有父/子函数的 Ajax 承诺
【发布时间】:2017-01-19 04:39:08
【问题描述】:

我正在使用带有taggle.js 的ajax 调用来对照数据库检查键入的标记值。 taggle 文档在onBeforeTagAdd 事件上指定return false 以防止添加标签,但我知道ajax 无法做到这一点,因为它是异步的。我已经看到其他 SO 问题建议承诺使函数依赖于 ajax 响应,但是当 ajax 调用位于依赖于其响应的父函数内部时,我很难理解如何使用承诺 - 任何人都可以提供建议吗?下面是 ajax 调用的代码:

new Taggle('tagexample', {
    onBeforeTagAdd: function(event, tag) {
        // return false here would prevent tag from being added
        $.ajax({
            method:"POST",
            url:"inputcheck.php",
            data:"tag="+tag,
            dataType:"html",
            success:function(result){
                alert(result);
                if (result == 'no') {
                    // return false here won't work
                }
            }

        });
    },
});

【问题讨论】:

  • 重新设计应用程序,以便您首先从服务器查询所有允许的标签到客户端数组中,然后您可以在onBeforeTagAdd 事件处理程序中使用它,而无需在那里进行任何 Ajax 调用。
  • 像您使用的回调 API 要么支持异步结果,要么不支持。如果没有,那么你无法从外部做任何事情来做到这一点。您可以修改 Taggle 源代码,可以预先检查预期的标签,以便同步获得它们的信息,或者您可以更改设计以另一种方式解决您的问题。

标签: javascript jquery ajax promise


【解决方案1】:

Taggle 需要在 onBeforeTagAdd 方法上支持 Promise,但看起来它并不支持。

我能想到的唯一可行的方法是始终返回 false(在进行 ajax 调用之后),如果是,则动态创建标签。

new Taggle('tagexample', {
    onBeforeTagAdd: function(event, tag) {
        $.ajax({
            method:"POST",
            url:"inputcheck.php",
            data:"tag="+tag,
            dataType:"html",
            success:function(result){
                alert(result);
                if (result == 'yes') {
                    // create tag
                }
            }

        });

        return false;
    },
});

【讨论】:

  • 我不知道为什么这被否决了。如果 Taggle API 不支持对验证的异步回答,则您无法从其代码外部使其执行此操作。这个答案提出了一种可能的解决方法,但它并不完美,但我希望看到其他人在投票之前提出一个更好的想法(除了重新编写 taggle 代码本身)。
猜你喜欢
  • 2019-09-29
  • 2015-12-05
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多