他们怎么称呼def.then在这里?

时间:2014-08-06 07:43:53

标签: javascript jquery promise jsfiddle

我正在阅读有关承诺的内容,并找到this fiddle

的作者创建的this post

代码在这里:

var def, getData, updateUI, resolvePromise;

// The Promise and handler
def = new $.Deferred();

updateUI = function (data) {
    $('p').html('I got the data!');
    $('div').html(data);
};
getData = $.ajax({
          url: '/echo/html/', 
          data: {
              html: 'testhtml', 
              delay: 3
          }, 
          type: 'post'
    })
    .done(function(resp) {
        return resp;
    })
    .fail(function (error) {
        throw new Error("Error getting the data");
    });


// Event Handler
resolvePromise = function (ev) {
    ev.preventDefault();
    def.resolve(ev.type, this);
    return def.promise();
};

// Bind the Event
$(document).on('click', 'button', resolvePromise);

def.then(function() {
    return getData;   
})
.then(function(data) {
    updateUI(data);
})
.done(function(promiseValue, el) {
    console.log('The promise was resolved by: ', promiseValue, ' on ', el);
});


// Console output: The promise was resolved by: click on <button> </button>

我从本系列的第一部分中了解到,deferred有一个promise,可以使用promise method对其进行曝光。

Promise then method返回promise进行链接。

在这里,他们解决了resolvePromise中延迟的承诺,然后是延迟的那个方法,我认为这是一个承诺被执行。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

jQuery中的延迟对象也是then ables,您可以使用它们代替promises。但这样做并不常见。

var d = $.Deferred().resolve();
d.then(function(){
   console.log("HI"); // this will run.
});

原始$.ajax .done.fail在这种情况下毫无意义,尤其是 .done,其返回值被忽略且没有影响。

老实说,我认为代码可以很容易地改进:

var getData = $.post('/echo/html/', { html: 'testhtml', delay: 3 }); 

var d = $.Deferred();
$(document).on('click', 'button', function(ev){
    d.resolve();
    return false;
});
$.when(d, getData).then(function(_, data){
    $('p').html('I got the data!');
    $('div').html(data);
}); 
  • 如果您只使用身份功能(即返回相同的内容而不执行任何其他操作).then中没有任何意义。
  • .done中没有任何意义只能归还同样的东西。
  • 一般来说,除非事件严格一次,否则我会反对处理事件的承诺。