以下jQuery代码是否等效于以ES6的方式完成代码,还是应该以不同的方式编写jQuery?
// ES6:
new Promise((resolve,reject) => {
console.log("start");
setTimeout(() => resolve("a"),2000);
}).then(s => {
console.log(s);
return new Promise((resolve,reject) => {
setTimeout(() => resolve("b"),2000);
});
}).then(s => {
console.log(s);
return new Promise((resolve,reject) => {
setTimeout(() => resolve("c"),2000);
});
}).then(s => {
console.log(s);
});
// jQuery:
let d = $.Deferred();
d.then(s => {
console.log(s);
let d = $.Deferred();
setTimeout(() => d.resolve("b"),2000);
return d.promise();
}).then(s => {
console.log(s);
let d = $.Deferred();
setTimeout(() => d.resolve("c"),2000);
return d.promise();
}).then(s => {
console.log(s);
})
console.log("start");
setTimeout(() => d.resolve("a"),2000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
似乎:
- 并非所有内容都可以用jQuery中的一个语句编写。执行器必须在jQuery中作为单独的语句移出。
- 对于jQuery,不仅需要涉及promise。需要使用延期付款,因为否则无法解决承诺。
- 在jQuery中,行
return d.promise();
只能是return d;
,但是返回延迟的行是否很好?接收延迟的代码可以无意间解决承诺,但是,如果它是链式承诺,那么任何代码都可以实际接收延迟并无意间解决承诺吗?
根据@Tomalak和@ jfriend00的评论,发现jQuery的Promise可以用这种方式编写,类似于ES6 Promise:
// jQuery:
$.Deferred(d => {
console.log("start");
setTimeout(() => d.resolve("a"),2000);
}).then(s => {
console.log(s);
return $.Deferred(d => {
setTimeout(() => d.resolve("b"),2000);
});
}).then(s => {
console.log(s);
return $.Deferred(d => {
setTimeout(() => d.resolve("c"),2000);
});
}).then(s => {
console.log(s);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
代替function(resolve,reject)
,it is function(deferred)
。
可以向jQuery.Deferred方法传递一个可选函数,该函数在方法返回之前被调用,并将新的延迟对象作为this对象和该函数的第一个参数传递。
仅当传递的延迟函数是传统函数而不是箭头函数时,传递的延迟才与this
相同。但是我认为最好使用传递的延迟d
而不是this
。