今後のことを考慮すればBabel環境を整えて、
Tak_Matzさんの回答のようなasync/awaitを使ったコードを自分も推奨します。
それを踏まえたうえで、IE対策としてお手軽なes5+polyfillでの回答も。
Promiseを返すFunctionを配列として持たせて、reduceで直列実行する手法です。
var opt1 = {width:***};は直接animate関数に書いてもよかったのですが、
「ここでもパラメータ定義の処理を書けますがいかがでしょう」
という意図で一つ上のスコープに定義にしてます。
Javascript
1'use strict';
2
3
4//配列を用意
5var anims = function () {
6 var maxsize = 10;
7 return Array(maxsize).fill().map(function (ignore, idx) {
8 return function ($elem) {
9 var opt1 = {
10 width: (idx + 1) / maxsize * 100 + '%'
11 };
12 var opt2 = {
13 top: (idx + 1) * 30 + 'px'
14 };
15 return new Promise(function (resolve) {
16 return $elem.animate(opt1).delay(500).animate(opt2, {
17 duration: 500,
18 complete: function complete() {
19 $elem.text(opt1.width);
20 resolve($elem);
21 }
22 });
23 });
24 };
25 });
26}();
27//reduceで直列実行
28anims.reduce(function (prev, curr) {
29 return prev.then(curr);
30 }, Promise.resolve($('div')))
31.then(function ($elem) {
32 $elem.text('complete');
33});
CSS
1div {
2 background:red;
3 width: 0%;
4}
動作確認(IE11対応)
https://jsfiddle.net/dqqtb48o/6/
一応元ソースが存在します。どうやらBabelなしではもう書けない体に^^
https://jsfiddle.net/dqqtb48o/2/
追記:Promise使わなくてもjQueryのqueueで出来ることを思い出しました。
配列でanimateのオプション作って貯めて、最後にdequeueで実行。
ma_a_kiさんのイメージに近いやり方です。
https://jsfiddle.net/dqqtb48o/8/