Является ли следующий 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 требуется не только обещание. Необходимо использовать deferred, потому что иначе невозможно выполнить обещание.
- В 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
.