Причина, по которой ваше текущее решение не применяет фон, связана со строкой:
$(".m").css(("background-image", bgs[i]), () => {
css()
ожидает свойство и значение , ("background-image", bgs[i])
является списком выражений , разделенных запятыми, и возвращает результат последнего выражения Таким образом, вышесказанное эквивалентно:
$(".m").css(bgs[i], () => {
Кроме того, css()
также не исключает обратный вызов, поскольку ожидается, что он будет применен немедленно (без учета CSS переходов).
Эта строка должна быть:
$(".m").css("background-image", bgs[i]); // also removing the closing })
Можно преобразовать jQuery fadeOut()
, fadeIn()
и animate()
до jQuery отложенные объекты с использованием promise()
.
A jQuery отложенный объект «затем» (т.е. имеет «затем» метод ) и, таким образом, может использоваться с async
/ await
(или с Promise.resovle()
).
Я не уверен, что мой пример охватывает то, что вы пытаетесь сделать, но это то, что я получил из предоставленного вами сценария:
async function cycleBackgrounds($element, backgrounds) {
while (true) {
for (const background of backgrounds) {
await $element.fadeOut(1000).promise();
await $element.animate({"margin-left": "0px"}).promise();
$element.css("background-color", background);
await $element.fadeIn(1000).promise();
await $element.animate({"margin-left": "200px"}).promise();
}
}
}
const promise = cycleBackgrounds($(".m"), ["red", "green", "blue"]);
// ^ The returned promise will never be resolved, since the function
// will cycle endlessly. You might still want to add a .catch though.
.m {
width: 50px;
height: 50px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="m"></div>