如何正确使用Deferrers?

时间:2014-08-13 17:39:57

标签: jquery ajax promise

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结束后。

3 个答案:

答案 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()创建另一个承诺。