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

时间:2015-02-07 09:42:20

标签: javascript jquery ajax wordpress

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

在我的主题functions.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中专门执行此操作的实例。

根据这个:

How do I return the response from an asynchronous call?

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

如何在JQuery语法中重写getUserId,以便我可以使用.done和.fail并从现有脚本中调用它?可悲的是,我没有JQuery专家,而且我在Javascript上的表现也不是很好!

1 个答案:

答案 0 :(得分:0)

目前尚不清楚你曾经尝试过什么。但是如果你只是从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 Content-Type标头:

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

你必须在任何身体被发送之前做这一点,甚至是空白。如果您这样做,那么jQuery.ajax将默认将其作为JSON读取。