Javascript JQuery赢得';调用drupal服务模块时,不能传递标记为sessiond的数据

Javascript JQuery赢得';调用drupal服务模块时,不能传递标记为sessiond的数据,javascript,jquery,drupal,Javascript,Jquery,Drupal,嘿,我正在处理一个json调用,它将用json实现Drupal的服务模块。我使用jquery的ajax函数调用该函数,但收到一个错误,指出没有传递任何参数。当我查看正在发布的查询字符串时,我注意到sessiond没有被传递,即使它带有参数。下面是我正在运行的 // JavaScript Document $(document).ready(function() { function drupalConnect(src) { $.ajax({ ur

嘿,我正在处理一个json调用,它将用json实现Drupal的服务模块。我使用jquery的ajax函数调用该函数,但收到一个错误,指出没有传递任何参数。当我查看正在发布的查询字符串时,我注意到sessiond没有被传递,即使它带有参数。下面是我正在运行的

// JavaScript Document
$(document).ready(function() {

    function drupalConnect(src) {
        $.ajax({
            url: src,
            type: 'POST',
            data: {
                method: 'system.connect'
            },
            success: function(data) {
                return data["result"]["sessid"];
            }
        });
    }

    function getTimestamp() {
        return Math.round((new Date).getTime() / 1000);
    }

    function randString(length) {
        var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
        var randomstring = '';
        for (var i = 0; i < length; i++) {
            var rnum = Math.floor(Math.random() * chars.length);
            randomstring += chars.substring(rnum, rnum + 1);
        }
        return randomstring;
    }


    var session_id = drupalConnect('http://localhost/drupal/services/json-rpc');
    var nonce = randString(10);
    var timestamp = getTimestamp();
    var username = "markusgray";
    var password = "Markus1990";
    var key = '2ae0392e0aebbfeeddefcc962ea1924f';
    var domain = 'localhost';

    var hashObj = new jsSHA(timestamp + ";" + domain + ";" + nonce + ";user.login", "TEXT");
    var hash = hashObj.getHMAC(key, "TEXT", "SHA-256", "HEX");

    var parameters = {
        hash: hash,
        domain_name: domain,
        domain_time_stamp: timestamp,
        nonce: nonce,
        sessid: session_id,
        username: username,
        password: password
    };

    var par = JSON.stringify(parameters);

    $.ajax({
        url: 'http://localhost/drupal/services/json-rpc',
        type: 'POST',
        dataType: 'json',
        data: {
            method: 'user.login',
            params: par
        },
        success: function() {

        }
    });
});​
//JavaScript文档
$(文档).ready(函数(){
功能连接(src){
$.ajax({
网址:src,
键入:“POST”,
数据:{
方法:“system.connect”
},
成功:功能(数据){
返回数据[“结果”][“会话”];
}
});
}
函数getTimestamp(){
返回Math.round((新日期).getTime()/1000);
}
函数字符串(长度){
var chars=“0123456789abcdefghijklmnopqrstuvwxtzabcdfghiklmnopqrstuvwxyz”;
var randomstring='';
对于(变量i=0;i
drupalConnect
不会返回任何内容,而且从
success
回调返回的内容也会被丢弃。使用ajax调用返回的数据的最佳方法是在回调本身中使用它

function drupalConnect(src){
    $.ajax({
        url: src,
        type: 'POST',
        data:{method:'system.connect'},
        success: function(data){
            var session_id = data["result"]["sessid"]; 
            //use session_id here
        }
    });
}

这是因为
异步
ajax,让我详细说明一下,为了获得
会话id
您正在进行ajax调用。此时它将发送请求,但无法确保此时会分配
会话id
。因此,当您进行第二次ajax调用时,
会话id
可能不会被分配值

有两种解决方法

一种是,使用一个选项
async:false
进行第一个ajax调用,并在成功调用中分配值,如

var session_id;

function drupalConnect(src) {
    $.ajax({
        url: src,
        type: 'post',
        async : false,
        data: {
            method: 'system.connect'
        },
        success: function(data) {
            session_id = data["result"]["sessid"];
        }
    });
};
$.when(
    // make your first ajax request
).then(function(data) {
    session_id = data["result"]["sessid"];
    // make your second ajax call
});​

第二种也是首选的方法是,使用

var session_id;

function drupalConnect(src) {
    $.ajax({
        url: src,
        type: 'post',
        async : false,
        data: {
            method: 'system.connect'
        },
        success: function(data) {
            session_id = data["result"]["sessid"];
        }
    });
};
$.when(
    // make your first ajax request
).then(function(data) {
    session_id = data["result"]["sessid"];
    // make your second ajax call
});​