Может быть, я медлительный. Может быть, большинство людей поднимают это без чьей-либо помощи. Может быть, в Интернете есть масса руководств, которые я пропустил. Я не знаю, но мне потребовалось больше года, чтобы понять, что я собираюсь здесь обсудить.

Я смутно припоминаю, что видел примеры этого ранее, но для меня это не имело смысла, и если я когда-либо читал какое-либо объяснение этого, оно не прижилось. Итак, вот оно, объяснение, которое я хотел бы иметь.

Распространенной ситуацией в JavaScript является код, напоминающий:

Promise
 .then(function(args){ handle args; return value; })
 .then(function(args){ handle args; return value; })
 .then(function(args){ handle args; return value; })
 …
 .catch(function(error){ handle error; })

Многие люди сокращают это, так что это выглядит так:

Promise
 .then((args)=>{ handle args; return value; })
 .then((args)=>{ handle args; return value; })
…

Или, если нет нужды сильно возиться с аргументами, это может быть даже:

Promise
 .then((args)=> value)
 .then((args)=> value )
…

Я думаю, что в этой версии я должен понять это раньше, но, возможно, я не единственный здесь тугодум, поэтому я решил поделиться этим на всякий случай.

Аргументы во втором (и т. д.) .then — это то, что возвращается из предыдущего.

Итак, такой код:

Promise
 .then((arg)=>arg+1)
 .then((arg)=>arg+1)
 .then((arg)=>console.log(arg))

Уилл, предполагая, что первый «аргумент» равен нулю, в конечном итоге выведет на консоль число 2.

Хорошо, это не такой уж большой скачок, но вот большая часть этого уравнения, которая просто попала в точку для меня.

Этот блок выше можно записать:

Promise
 .then(arg=>arg+1)
 .then(arg=>arg+1)
 .then(console.log)

Он будет работать точно так же. Вместо того, чтобы создавать функцию закрытия с аргументом, а затем передавать ее в консоль, я могу просто предоставить функцию console.log, и ей автоматически будет передано значение, возвращенное из предыдущего блока .then.

Вы можете сделать это с любой функцией, включая собственную.

Возможно:

function compress(str){ return compressedString; }
function send(str){ wretch(“send/url”).post(str) }
Promise
 .then(JSON.stringify)
 .then(compress)
 .then(send)

Такое разбиение моего кода на фрагменты делает его гораздо более читабельным и аккуратным. Это позволяет мне разбиваться на модули в разные файлы, что упрощает обслуживание кода.

В общем, я нахожу это очень полезным лакомым кусочком мелочей, и мне жаль, что я не разобрался с ним раньше.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.