我正在阅读有关承诺的内容,并找到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
中延迟的承诺,然后是延迟的那个方法,我认为这是一个承诺被执行。我在这里缺少什么?
答案 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
中没有任何意义只能归还同样的东西。