2016-12-07 89 views
2

我正在尝试将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'); 
     }); 


    }); 

}); 

控制台输出(因为你可以看到,它仍然asynchronious):

enter image description here

你有什么想法?

回答

3

你是真的关闭。几件事:

  1. 你忘了退还evalXpath的承诺。

  2. 为了得到适当的承诺价值链(例如,为了你的价值从回调内部evalXpath到再成为它返回的承诺的分辨率值),使用then,不done

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

所以:

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)