Ответ 1
В рамках цепочки обещаний было бы плохой практикой назвать синхронный функция?
Нет, это совсем не плохая практика. Это одна из многих ожидаемых и полезных практик.
Вы можете свободно вызывать либо синхронные функции в цепочке обещаний (изнутри обработчиков .then()
), либо асинхронные функции, которые затем возвращают новое обещание.
Когда вы возвращаете что-то из обработчика .then()
, вы можете вернуть либо значение (которое становится разрешенным значением родительского обещания), либо вы можете вернуть другое обещание (которое связано с предыдущим обещанием), или вы можете бросить работает как возвращение отклоненного обещания (цепочка обещаний отвергается).
Итак, это означает, что вы можете вызвать синхронную функцию и получить от нее значение или вызвать функцию async и получить другое обещание, а затем вернуться либо из обработчика .then()
.
Все эти синхронные вещи совершенно легальны, и каждый из них имеет свою собственную цель. Вот некоторые синхронные события в обработчике .then()
:
// modify resolved value
someAsync().then(function(val) {
return val + 12;
});
// modify resolved value by calling some synchronous function to process it
someAsync().then(function(val) {
return someSynchronousFunction(val);
});
// synchronously check the value and throw to change the promise chain
// to rejected
someAsync().then(function(val) {
if (val < 0) {
throw new Error("value can't be less than zero");
}
return val;
});
// synchronously check the value and return a rejected promise
// to change the promise chain to rejected
someAsync().then(function(val) {
if (val < 0) {
return Promise.reject("value can't be less than zero");
}
return val;
});
Вот небольшой пример операции async, которая возвращает обещание, за которым следуют три синхронных обработчика .then()
, а затем выводя окончательное значение:
function delay(t, val) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(val);
}, t);
});
}
function increment5(val) {
return val + 5;
}
delay(500, 10).then(increment5).then(function(val) {
return val - 3;
}).then(function(final) {
document.write(final);
});