我试图将XPATH评估添加到我的表单中。当用户填写XPATH时,它会在使用AJAX的服务器上进行评估,然后返回true
或false
。
问题是这个函数似乎总是返回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');
});
});
});
控制台输出(如您所见,它仍然是异步的):
你有什么想法吗?
答案 0 :(得分:3)
你真的关闭。有几件事:
您忘记退回evalXpath
的承诺。
要获得正确的承诺值链接(例如,为了使您在evalXpath
内的回调中的值成为它返回的承诺的分辨率值),请使用then
,而不是done
。
然后在使用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)