如何使用promise在Wordpress中编写Ajax JQuery

How to write an Ajax JQuery in Wordpress using promises

本文关键字:Ajax JQuery Wordpress 何使用 promise      更新时间:2023-09-26

我正在开发一个Wordpress谷歌地图插件,该插件通过Ajax从数据库中提取位置,并返回一个XML文件,然后由Javascript脚本处理,以便在谷歌地图上绘制这些位置。这一切都很完美,但我希望能够将它显示的数据限制在当前登录用户所拥有的位置。由于WP用户id存储在表中,这应该很容易。。。

在我的主题函数.php文件中,我有这个函数:

// Same handler function...
add_action( 'wp_ajax_get_current_user_id', 'get_current_user_id_callback' );
function get_current_user_id_callback() {
    if (is_user_logged_in()) {
        echo get_current_user_id();
        wp_die();
    }
}
add_action('template_redirect', 'my_enqueue');
function my_enqueue() {
    // Enqueue the Javascript file
    wp_enqueue_script( 'ajax-script', '/ajax/ajax-user.js', array('jquery') );
    // in JavaScript, object properties are accessed as ajax_object.ajax_url, ajax_object.we_value
    wp_localize_script( 'ajax-script', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' )) );
}

在处理XML的Javascript文件中,我有以下功能:

function getUserId() {
    var data = {'action': 'get_current_user_id'};
    jQuery.post(ajax_object.ajax_url, data, function(response) {
        userId=response;
        alert ('Within JQuery userId=' + userId);
        return userId;}
    );
}

当脚本加载时,它被调用:

var userId;
function load () {
    userId=getUserId();
    alert ('Outside of JQuery UserId=' + userId);
}

问题是,getUserId在有时间从数据库获取响应之前运行并返回undefined。我知道解决这个问题的方法是使用Ajax承诺,但我在Wordpress中找不到具体的工作示例。

据此:

如何从异步调用返回响应?

我只需要重写我的getUserId函数,使其包含.done和.fail,但如果我尝试这样做,我会得到语法错误,因为它不是真正的JQuery

如何在JQuery语法中重写getUserId,以便使用.done和.fail并从现有脚本中调用它?遗憾的是,我不是JQuery专家,我在Javascript方面也没有好到哪里去!

您到底尝试了什么还不清楚。但是,如果您只是从AJAX调用返回jqXHR,它应该可以工作:

function getUserId() {
    var data = {'action': 'get_current_user_id'};
    return jQuery.post(ajax_object.ajax_url, data);
}

然后在上面调用done方法:

getUserId().done(function(data) {
    alert( /* userid, depends on data */ );
});

顺便说一句,如果您告诉jquery解析JSON会更容易;这样,data将是一个对象,而不是一个JSON字符串。有两种方法可以做到这一点。您可以将'json'参数添加到jQuery.post:

jQuery.post(ajax_object.ajax_url, data, null, 'json');

或者,您可以编写PHP脚本,以便它发送HTTP内容类型标头:

header('Content-type: application/json');

您必须在发送任何正文(甚至是空白)之前完成这一点。如果您这样做,那么jQuery.ajax将默认将其读取为JSON。