javascript - 他们怎么能在这里调用 def.then 呢?

标签 javascript jquery promise jsfiddle

我正在阅读有关 Promise 的内容,发现 this fiddlethis 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 方法 对其进行公开.

Promise 有 then 方法,它返回一个用于链接的promise

在这里,他们在 resolvePromise 中解析了 deferred 上的 Promise,然后执行了 deferred 上的 then 方法,我认为这不是一个 Promise。我在这里缺少什么?

最佳答案

jQuery 中的延迟对象也是thenable,您可以使用它们代替 Promise。不过,这样做并不常见。

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 没有任何意义。
  • 仅返回相同的内容是没有意义的。
  • 一般来说,我建议不要 promise 处理事件,除非这些事件严格来说是一次性的。

关于javascript - 他们怎么能在这里调用 def.then 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25154854/

相关文章:

node.js - 在 Node js 应用程序中异步运行 request.post

javascript - 函数被事件调用两次

javascript - 选择框动态更改相关选项

javascript - promise 的值究竟是如何更新的?

javascript - 将 req 数据传递到 Q Promise

javascript - JS事件碰撞

javascript - 使用 webpack (Babel/ES6) 导入 moment-timzone 和 moment-range

javascript - html5输入类型范围始终指向最小值并且在文本输入上没有得到onChange

javascript - 以编程方式选择另一个 contenteditable div 上的部分内容

jQuery 后代选择器选择了祖先之外的元素