Прежде всего, ваш код Promise неисправен, потому что вы не создаете Promise правильно
new Promise(function(resolve, reject) {
// in here you call resolve or reject otherwise Promise is forever pending
});
Однако, поскольку a1
возвращает Promise (как и все функции, япри условии, что вам не нужно создавать обещание
Итак, ваш код будет
a1()
.then(function() {
if (somecondition == true) {
return a2();
} else {
f2(); // since there's no return here, there's no "wait" for the promise f2 returns
}
})
.then(function() {
return f1();
})
Чтобы проиллюстрировать вышесказанное, вот ваш код один раз с условием true, а затем с условием false
Обратите внимание на «временные метки» для вывода на консоль
// dummy code to set up some promises
const dummy = (x, d=1000) => {
console.log(performance.now(), 'start', x);
return new Promise(resolve => setTimeout(() => {
console.log(performance.now(), 'end', x);
resolve(x);
}, d));
};
const a1 = () => dummy('a1');
const a2 = () => dummy('a2');
const f1 = () => dummy('f1');
const f2 = () => dummy('f2', 3000);
// end dummy code
console.log('wait for a2');
a1()
.then(function() {
if (true) {
return a2();
} else {
// random function for which f1 shouldn't wait
f2();
}
})
.then(function() {
return f1();
})
.then(() => {
console.log('dont wait for f2');
a1()
.then(function() {
if (false) {
return a2();
} else {
// random function for which f1 shouldn't wait
f2();
}
})
.then(function() {
f1();
});
});
Однако!Если f2 - функция, которая не имеет асинхронности, то нет способа * предотвратить вызов f1 после завершения f2 - потому что именно так работает javascript
* - Полагаю, вы могли бы поместить его в setTimeout, тогда f2 будет выполняться после начала f1 (опять-таки, если f1 имеет некоторую асинхронность, иначе f2 начнется после окончания f1)