Известно, что можно объединить несколько Обещаний в цепочку и таким образом вызывать onFulfilled
обратных вызовов ровно один за другим (несмотря на то, что они будут асинхронными друг от друга):
Promise.resolve()
.then(() => {
console.log("i will be the first one");
})
.then(() => {
console.log("i will be the second one"); // definetely second
})
;
Но как быть с последующими обещаниями, не связанными цепочкой?
Простейший пример:
Promise.resolve()
.then(() => console.log("i will be the first one"))
;
Promise.resolve()
.then(() => console.log("i will be the second one")) // sure?
;
По моему наивному мнению, обратные вызовы Promises работают через очередь событий (примерно так же, как событие таймера внутри setTimeout
) и таким образом сначала Promise.resolve()
помещают свое событие в очередь перед тем, как это сделает второй, поэтому первый обратный вызов будет вызываться раньше. второй.
Но я не уверен, что есть какие-либо гарантии по этому поводу. Могу ли я рассчитывать на это или это асинхронное лото? Кто-нибудь знает, что спецификации говорят об этом?
UPDATE
Некоторые из вас заметили, что самый простой пример бесполезен, поэтому я хочу объяснить мою первоначальную проблему.
У меня есть класс, который лениво инициализирует экземпляр другого класса и предоставляет метод get для размещенного экземпляра:
class Lazy {
/** @param {Class} T */
constructor(T) { }
/** @returns {Promise.<T>} */
instance() {
// there will be complex async initialization at first call
// and Promise.resolve() at following calls
}
}
class Foo {
on() { }
off() { }
}
/** @type {Lazy.<Foo>} */
let foo = new Lazy(Foo);
foo.instance().then((i) => i.on());
foo.instance().then((i) => i.off());
Последние две строки раскрывают мою проблему - трудно работать с экземпляром Foo
таким образом, когда я не уверен, что on()
будет вызван раньше off()
.