函数不返回任何内容(异步?)

时间:2016-12-07 13:28:14

标签: javascript jquery ajax

我试图将XPATH评估添加到我的表单中。当用户填写XPATH时,它会在使用AJAX的服务器上进行评估,然后返回truefalse

问题是这个函数似乎总是返回undefined。我认为这是因为JS的异步行为所以我使用$.when但它没有帮助。

function evalXpath(xpath) {
    var test = $.post('/api/test-xpath/', {'xpath': xpath});
    test.done(function (data) {
        console.log('BEFORE RETURN '+Boolean(data['success']));
        return Boolean(data['success']);
    })
}

$(document).ready(function () {
    $('#id_xpath').on('change', function () {
        var xpath = $("#id_xpath").val();
        $.when(evalXpath(xpath)).done(function (evaluated) {
            console.log('RETURNED '+evaluated);
            $('#xpath-valid').text(evaluated ? 'VALID' : 'INVALID');
        });


    });

});

控制台输出(如您所见,它仍然是异步的):

enter image description here

你有什么想法吗?

1 个答案:

答案 0 :(得分:3)

真的关闭。有几件事:

  1. 您忘记退回evalXpath的承诺。

  2. 要获得正确的承诺值链接(例如,为了使您在evalXpath内的回调中的值成为它返回的承诺的分辨率值),请使用then,而不是done

  3. 然后在使用evalXpath时,不需要$.when

  4. 所以:

    function evalXpath(xpath) {
        var test = $.post('/api/test-xpath/', {'xpath': xpath});
        return test.then(function (data) {
    //  ^^^^^^      ^^^^
            console.log('BEFORE RETURN '+Boolean(data['success']));
            return Boolean(data['success']);
        })
    }
    
    // ...
    evalXpath(xpath).then(function (evaluated) {
    //               ^^^^ (this one could be `done`, but let's be consistent)