ES6 Promises - вызов синхронных функций в цепочке обещаний

В настоящее время я экспериментирую с promises и задаю действительно основной вопрос!

В рамках цепочки обещаний было бы плохой практикой назвать синхронную функцию? Например:

.then(function(results) {

    if(checkIfResultInMemory(results) === true){
       return getTotalFromMemory()
    }

   return results;

  })

Или нужно ли реорганизовать мои функции синхронизации для возврата promises?

Ответы

Ответ 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);
});

Ответ 2

A then функция обратного вызова должна:

  • вернуть другое обещание
  • возвращает синхронное значение (или undefined)
  • отправить синхронную ошибку