与ES6承诺链接的编写方式相比,以下是jQuery承诺链接的编写方式吗?

以下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>

似乎:

  1. 并非所有内容都可以用jQuery中的一个语句编写。执行器必须在jQuery中作为单独的语句移出。
  2. 对于jQuery,不仅需要涉及promise。需要使用延期付款,因为否则无法解决承诺。
  3. 在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

wdjylove 回答:与ES6承诺链接的编写方式相比,以下是jQuery承诺链接的编写方式吗?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2738394.html

大家都在问