仅在ajax调用完成后返回函数值?

时间:2011-04-04 16:07:18

标签: javascript ajax mootools

所以我使用的是mootools,我有一个调用ajax脚本来获取值的函数。然后在函数中返回该值。但是,由于某种原因,该函数返回的速度太快,无法进行AJAX调用!

我做错了什么......

function getCredits() {
    var loadGlobalTab = new Request.JSON({
        url: {my api, url removed for security},
        evalScripts : true,
        async: false,    // I tried this, hoping it would stop the function from returning too soon, but no dice.
        onSuccess: function(returnInfo) {
            alert(returnInfo.data.total);
            return returnInfo.data.total;
        }
    }).send(sendData);    // Where sendData has been defined prior
}

警报返回正确的值,因此我知道AJAX调用有效,但是,函数本身不返回任何内容,这意味着在进行AJAX调用时,函数会立即结束。

我尝试在最后添加return 100,只是为了踢,并且函数返回100。

3 个答案:

答案 0 :(得分:4)

编辑哦亲爱的。因打个电话而被殴打。没关系!

ajax是异步的,使用async:false只是错误的方法。相反,使用从onComplete / onSuccess直接调用的查询结果运行第二个回调函数。

如果你真的必须这样做它阻止,那么这很好用:

var blockingCheck = function() {
    var obj = {};
    new Request.JSON({
        url: '/echo/json/',
        data: {
            json: JSON.encode({
                text: 'some text',
                array: [1, 2, 'three'],
                object: {
                    par1: 'another text',
                    par2: [3, 2, 'one'],
                    par3: {}
                }
            }),
            delay: 3
        },
        async: false,
        onSuccess: function(response) {
            obj = response;
        }
    }).send();

    return obj;
};

console.log(blockingCheck());

http://jsfiddle.net/dimitar/eG4t2/

答案 1 :(得分:2)

ajax是asynchronous

这意味着JS将通过它阅读,如果当时没有返回,那么什么都没有。

要做的好事是回调而不是回报:

function getCredits() {
    var loadGlobalTab = new Request.JSON({
        url: {my api, url removed for security},
        evalScripts : true,
        headers: {'ACCEPT': 'json','X_REQUESTED_WITH':'jsonhttprequest'},
        onSuccess: function(returnInfo) {
            alert(returnInfo.data.total);
            //goto callback
            getCredits_Callback(returnInfo.data.total);
        }
    }).send(sendData);    // Where sendData has been defined prior
}

function getCredits_Callback(total){
   //do something with total
}

第二种方法:

function getCredits() {
    var loadGlobalTab = new Request.JSON({
        url: {my api, url removed for security},
        evalScripts : true,
        headers: {'ACCEPT': 'json','X_REQUESTED_WITH':'jsonhttprequest'},
        onSuccess: getCredits_Callback
    }).send(sendData);    // Where sendData has been defined prior
}

function getCredits_Callback(returnInfo){
   //do something with returnInfo
}

答案 2 :(得分:1)

它什么也没有返回,因为你的return语句返回到一个对象的属性,而不是你认为它返回的变量。最好将“onSuccess”的功能传递给单独的处理函数。这样你就可以处理闭包之外的返回值。