предисловие
Это первая глава серии глав с интервью, написанная автором. Она в основном основана на резюме интервью автора за предыдущий месяц. Спасибо за просмотр.
Что такое обратный вызов? Почему это называют адом обратного вызова?
do('eat', (dishes) => {
//吃完饭后再去洗盘子
washDishes(dishes)
})
Вышеприведенный код, который все часто видят, включает в себя ajax, методы различных модулей и т. д., все они являются callback-функциями.
По сути, это метод (мытье посуды), который вызывается после получения конкретных данных (посуды) после выполнения определенных операций (приема пищи).
Я использую это нормально, почему существует ад обратного вызова?
ajax1(url, () => {
ajax2(url, () => {
ajax3(url, () => {
doSomething()
})
})
})
Если вам нужно использовать несколько интерфейсов при написании бизнес-кода, но гусиному интерфейсу A нужен параметр res обратного вызова интерфейса B для запроса данных? Таким образом, это будет написано как три или четыре вложенных функции обратного вызова.
Писать такой код, хоть он и выглядит хорошо, можно и меньше, если будет 7 или 8 одинаковых сцен, то он взорвется!
Сначала поговорим о недостатках
- Связывание кода после модификации взрывается на месте.
- Если вы не можете использовать try catch, вы не сможете отлаживать и взрывать на месте.
Большие ребята вместе придумывают способ, подумайте, есть следующие решения, в которых автор хорош.
1. generator
const eat = function* () {
yield 1;
yield 2;
return 3;
}
let do = eat();
do.next(); // { value: 1, done: false }
do.next(); // { value: 2, done: false }
do.next(); // { value: 3, done: true }
do.next(); // { value: undefined, done: true }
Это решение.Подробности см. в Введении учителя Руан Ифэн в стандарты ES6 (автор не хочет расширяться).
2. promise
let eat = () => {
return new Promise((resolve, reject) => {
resolve('俺吃好啦,给你盘子')
})
}
eat.then( res => {
//吃完后给你再洗盘子
let washResult = washDishes(res);
return washResult;
})
.then(res => {
//洗完盘子后,你妈妈甚至还奖励你吃冰淇淋!
eatIceCream(res)
})
Это хорошо Обещание похоже на девушку, за которой ты гонишься, Джейн.
У него три состояния: ожидание (ожидание) завершено (решено) отклоненный.
Вы подарили А Чжэнь ожерелье, и она думала, стоит ли ей принять А Цян? Это ожидает ожидания.
А-Джин думает, что ты хороша Все размеры 180, гм. Я принимаю тебя! Мы целовались с Джейн, когда были сильными. Это решение завершено.
Ажен чувствует, что Авей красивее вас, и не хочет принимать ваши ухаживания, поэтому отвергает вас, и весь процесс сталкивается с ошибками и проблемами. это отклонение
Это простое обещание.
3. async/await
async function eat () {
let washResult = await washDishes();
let eatIceCream = await buyIceCream(washResult);
let eatCake = await buyCake(eatIceCream);
//你妈妈看你吃的多,再奖励大胖儿子一个cake!
}
Эта штука на самом деле слой синтаксического сахара, плюс функция асинхронной команды, она вернет промис.
Смысл тот же, что и у А Цяна, влюбившегося в А Чжэня, но способ преследовать А Чжэня гораздо удобнее.
Вернуться к теме! Вы знаете, что такое ад обратного вызова? Вы можете сказать это.
- Что такое функция обратного вызова ответа?
- Почему существует ад обратного вызова?
- Как я могу это исправить?
- Расширьте свое решение.
- Расширьте свое решение.
- Расширьте свое решение.
Например, собственный ответ автора на этот вопрос таков:
1.因为javascript是单线程的,所以有些需要等待的地方,需要使用回调函数。
2.由于某些业务的问题,在代码中会一次性写会多层的回调嵌套,回调嵌套后的代码的维护难度,和无法排除bug。这个就被称作回调地狱。
3.我在工作中,一般处理的方式是使用promise或者async函数。
4.promise由于xxxx 对于开发这种多层嵌套的代码很方便,降低了代码的维护难度等等。
5.promise是XXX时新增的,拥有着xxxx的特性等等。
6.promise下面的all函数我也经常用到xxxxxxx
7.你甚至还可以手写个promise!