Интервьюер: Вы знаете Callback Hell?

опрос

предисловие

Это первая глава серии глав с интервью, написанная автором. Она в основном основана на резюме интервью автора за предыдущий месяц. Спасибо за просмотр.


Что такое обратный вызов? Почему это называют адом обратного вызова?

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. Что такое функция обратного вызова ответа?
  2. Почему существует ад обратного вызова?
  3. Как я могу это исправить?
  4. Расширьте свое решение.
  5. Расширьте свое решение.
  6. Расширьте свое решение.

Например, собственный ответ автора на этот вопрос таков:

1.因为javascript是单线程的,所以有些需要等待的地方,需要使用回调函数。
2.由于某些业务的问题,在代码中会一次性写会多层的回调嵌套,回调嵌套后的代码的维护难度,和无法排除bug。这个就被称作回调地狱。
3.我在工作中,一般处理的方式是使用promise或者async函数。
4.promise由于xxxx 对于开发这种多层嵌套的代码很方便,降低了代码的维护难度等等。
5.promise是XXX时新增的,拥有着xxxx的特性等等。
6.promise下面的all函数我也经常用到xxxxxxx
7.你甚至还可以手写个promise!

Ну, что нужно сказать, закончилось.
Вероятно, в будущем будет куча статей об интервью.
Если у вас есть какие-либо достижения или вопросы, пожалуйста, прокомментируйте ниже и поставьте лайк! Спасибо за просмотр здесь.