Является ли следующее, как написано jQuery цепочка обещаний по сравнению с тем, как пишется цепочка обещаний ES6? - PullRequest
0 голосов
/ 21 января 2020

Является ли следующий 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 требуется не только обещание. Необходимо использовать deferred, потому что иначе невозможно выполнить обещание.
  3. В jQuery строка return d.promise(); может быть просто return d;, но хорошо ли возвращать отложенное? Код, который получает отложенное, может непреднамеренно разрешить обещание, но может ли какой-либо код получить отложенное и непреднамеренно разрешить обещание?

Согласно комментариям @Tomalak и @ jfriend00, Обнаружено, что обещания jQuery можно записать так, как обещания ES6:

// 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), это function(deferred).

jQuery. Отложенному методу может быть передана необязательная функция, которая вызывается непосредственно перед возвратом метода и передается новому отложенному объекту как в качестве объекта this, так и в качестве первого аргумента функции.

Передано в deferred - это то же самое, что и this, только если это традиционная функция, но не функция стрелки. Но я думаю, что будет лучше использовать переданный в отложенном d вместо использования this.

...