Timeline Replay call a() call a() resolve a() call b() resolve b() call c() resolve c() Timeline Replay resolution_index = 0, io_index = 0 call a() call a: return promise compare resolutions[resolution_index] with io_index io_index < resolutions[0] do not resolve io_index++ call b() call b: return promise compare resolutions[0] && io_index io_index < resolutions[0] do not resolve call c() call c: return promise resolve c() resolve b() resolve a() resolutions: [ 3, 2, 1, ] Делаем реплей. К нам приходят события - вызовы функций. Мы перехватываем вызов, возвращаем промис, и ресолвим тот промис, который сейчас надо заресолвить. Например, в примере выше мы ресолвим a() после вызова с(). А b() ресолвим после ресолва с(). То есть мы можем ресолвить несколько за раз. Record: [ call a resolve a call b resolve b ] Replay: [ call a смотрим что возвращается промис, взводим ресолвер ресолвер сработал resolve a call b смотрим что возвращается промис, взводим ресолвер ресолвер сработал resolve b ] call resolve