var numerodepuntos;
$.when($.get('/u2', function(ospuntosyou) {
numerodepuntos = parseFloat($(ospuntosyou).find('#field_id-13 dd').text());
console.log('Esto: '+numerodepuntos)
})).done(console.log('Esto: '+numerodepuntos));
我尝试使用此代码并从ajax请求获取变量,但第二个console.log返回undefined,就像它立即加载一样,而不是在$ get结束后。
答案 0 :(得分:0)
问题是JavaScript不是Scala - 没有名字传递。因此console.log
中的.done(console.log(...))
会在执行$.when
后立即执行,并且该调用的结果会传递给done
(例如{{1} }})。
将最后的undefined
来电包裹在一个函数中,事情就会起作用:
done
值得注意的是,所有这些都可以大大简化:
$.when($.get('/u2', function(ospuntosyou) {
var numerodepuntos = parseFloat($(ospuntosyou).find('#field_id-13 dd').text());
console.log('Esto: '+numerodepuntos);
return numerodepuntos;
})).done(function doneCallback(numerodepuntos) {
console.log('Esto: '+numerodepuntos);
});
答案 1 :(得分:0)
'完成'期望一个函数与$ .get中的success函数非常相似。我也建议 你将它分成几部分,使你的代码缩进。这是你的模式:
var numerodepuntos;
var promise = $.get('/u2', function(ospuntosyou) {
numerodepuntos = parseFloat($(ospuntosyou).find('#field_id-13 dd').text());
console.log('Esto: '+numerodepuntos)
})
promise.done(function(ospuntosyou) {
numerodepuntos = parseFloat($(ospuntosyou).find('#field_id-13 dd').text());
console.log('Esto: '+numerodepuntos));
}
但当然因为完成功能与成功功能相同,所需要的只是:
var promise = $.get('/u2')
promise.done(function(ospuntosyou) {
var numerodepuntos = parseFloat($(ospuntosyou).find('#field_id-13 dd').text());
console.log('Esto: '+numerodepuntos));
}
答案 2 :(得分:0)
我建议您只使用承诺或仅使用成功处理程序,而不是两者的混合,您不会产生这种混淆。例如,我不确定jQuery中是否存在内部规范,以确定是先执行回调还是承诺。在任何一种情况下,你都不应该依赖它们之间的时间安排。
这是一种只使用没有问题的承诺的方法。
$.get('/u2').done(function(ospuntosyou) {
var numerodepuntos = parseFloat($(ospuntosyou).find('#field_id-13 dd').text());
console.log('Esto: '+numerodepuntos)
});
注意 - 我在numerodepuntos
处理程序中声明了.done()
,这很重要,因为从.done()
处理程序外部填充该变量的时间不确定,你应该只在.done()
处理程序或您调用的函数中使用该结果,并将数据从那里传递给它。如果你对此感到困惑,那么请阅读ajax调用返回数据的这个参考:
How do I return the response from an asynchronous call?
仅供参考,没有理由在单一承诺上使用$.when()
。您可以直接使用$.get()
返回的承诺上的方法,这可以避免要求$.when()
创建另一个承诺。