1
00:00:03,920 --> 00:00:08,675
В этой лекции и упражнении, которое следует за этим,

2
00:00:08,675 --> 00:00:12,000
мы поговорим конкретно о Callback Hell.

3
00:00:12,000 --> 00:00:15,330
Проблема, которая возникает, когда вы пишете

4
00:00:15,330 --> 00:00:19,980
обратные вызовы в узле и особенно вложенные обратные вызовы и узел.

5
00:00:19,980 --> 00:00:26,795
Мы также рассмотрим обещания как один из способов решения проблемы обратного вызова Ада.

6
00:00:26,795 --> 00:00:34,340
Чтобы дать вам представление о том, что приведет к типичной проблеме Callback Hell,

7
00:00:34,340 --> 00:00:40,115
давайте вернемся к файлу index.js из предыдущего упражнения.

8
00:00:40,115 --> 00:00:44,020
Когда я говорил об этом в предыдущем упражнении,

9
00:00:44,020 --> 00:00:47,959
вы заметили, что для каждой из операций, которые мы выполняем,

10
00:00:47,959 --> 00:00:53,990
последующая операция включается внутри функции обратного вызова здесь

11
00:00:53,990 --> 00:01:00,320
и так далее, пока вы не сформируете пирамиду, подобную структуре, не пойдете снова.

12
00:01:00,320 --> 00:01:06,160
Таким образом, вы видите эту пирамиду, как структуру, возникающую в вашем коде.

13
00:01:06,160 --> 00:01:11,540
Теперь представьте, что вам нужно выполнить несколько вложенных операций, подобных этому,

14
00:01:11,540 --> 00:01:13,850
ваш код станет довольно скоро

15
00:01:13,850 --> 00:01:18,085
, очень сложным и не так легко расшифровать.

16
00:01:18,085 --> 00:01:22,240
Теперь это то, что в мире node.js,

17
00:01:22,240 --> 00:01:25,830
они называют «Адом обратного вызова».

18
00:01:25,960 --> 00:01:30,845
Существует несколько способов смягчения возникающей проблемы.

19
00:01:30,845 --> 00:01:35,690
Теперь вы можете полностью избежать этого из-за того

20
00:01:35,690 --> 00:01:38,300
, что у вас есть определенные операции, которые необходимо

21
00:01:38,300 --> 00:01:41,480
выполнить до начала следующей операции,

22
00:01:41,480 --> 00:01:47,765
но мы можем изменить порядок кода таким образом, чтобы смягчить эту проблему.

23
00:01:47,765 --> 00:01:52,080
Обещания являются одним из таких способов решения этой проблемы.

24
00:01:52,080 --> 00:01:56,015
Таким образом, чтобы суммировать то, что мы только что обсудили,

25
00:01:56,015 --> 00:01:59,435
сильно вложенный код

26
00:01:59,435 --> 00:02:02,990
обратного вызова вызывает проблему обратного вызова, и это является

27
00:02:02,990 --> 00:02:07,010
результатом нашей тенденции писать программы сверху вниз.

28
00:02:07,010 --> 00:02:11,990
Мы все еще повесили наш последовательный способ написания кода, и

29
00:02:11,990 --> 00:02:17,420
поэтому мы видим, что более удобно писать код сверху вниз

30
00:02:17,420 --> 00:02:21,145
и смотреть на него, как будто он выполняется в этом порядке.

31
00:02:21,145 --> 00:02:24,140
Теперь мы можем обойти проблему Callback Hell,

32
00:02:24,140 --> 00:02:27,460
не используя анонимные функции для обратных вызовов, но вместо этого

33
00:02:27,460 --> 00:02:30,870
объявляя эти функции с определенными именами,

34
00:02:30,870 --> 00:02:35,630
а затем избегать того, как мы пишем код, как вы видели здесь.

35
00:02:35,630 --> 00:02:41,190
Это один из подходов, которые люди используют, чтобы справиться с проблемой обратного ада.

36
00:02:41,190 --> 00:02:44,990
Существует несколько других подходов, которые были предложены,

37
00:02:44,990 --> 00:02:51,085
ссылки на несколько статей по этому вопросу приводятся в дополнительных ресурсах.

38
00:02:51,085 --> 00:02:53,720
Но в этой конкретной лекции

39
00:02:53,720 --> 00:02:56,810
я сосредоточусь на одном конкретном подходе, который

40
00:02:56,810 --> 00:03:00,275
используется для решения проблемы Callback Hell,

41
00:03:00,275 --> 00:03:02,370
то есть использовании обещаний.

42
00:03:02,370 --> 00:03:07,345
Таким образом, мы можем использовать обещания, чтобы приручить проблему обратного вызова Ада в значительной степени.

43
00:03:07,345 --> 00:03:12,200
Мы рассмотрим, как обещания помогают нам в этом отношении, и в

44
00:03:12,200 --> 00:03:17,180
упражнении мы увидим, как, поскольку драйвер NODE-MONGO DB уже

45
00:03:17,180 --> 00:03:21,665
поддерживает прокси-интерфейс, мы можем использовать его, чтобы переписать наш код,

46
00:03:21,665 --> 00:03:27,495
чтобы воспользоваться поддержкой обещаний в драйвере MONGO DB.

47
00:03:27,495 --> 00:03:31,455
Кратко обобщив, что такое обещание.

48
00:03:31,455 --> 00:03:35,625
Обещание - это механизм, который поддерживает асинхронные вычисления.

49
00:03:35,625 --> 00:03:39,250
Поэтому, если у вас есть объем работы, который необходимо сделать,

50
00:03:39,250 --> 00:03:43,550
обещание действует как прокси для значения, которое

51
00:03:43,550 --> 00:03:48,100
не известно на данный момент, но обещание дается вам.

52
00:03:48,100 --> 00:03:50,270
Но когда значение станет доступным,

53
00:03:50,270 --> 00:03:53,225
оно будет доступно в будущем.

54
00:03:53,225 --> 00:03:56,690
Таким образом, обещание представляет собой заполнитель для этого значения.

55
00:03:56,690 --> 00:03:58,795
Если значение получается правильно,

56
00:03:58,795 --> 00:04:02,240
то ваше обещание правильно, и вы можете

57
00:04:02,240 --> 00:04:08,735
выполнить часть кода, чтобы обработать тот факт, что обещание разрешено правильно,

58
00:04:08,735 --> 00:04:12,950
если нет, то вы обрабатываете ошибку в этой ситуации.

59
00:04:12,950 --> 00:04:20,060
Таким образом, обещание решится либо в решение, либо в отказ от обещания.

60
00:04:20,060 --> 00:04:23,515
Ожидающее обещание может либо разрешить,

61
00:04:23,515 --> 00:04:27,105
когда значение правильно получено, так что в этом случае

62
00:04:27,105 --> 00:04:31,755
оно разрешится, либо то, что мы называем выполнением обещания.

63
00:04:31,755 --> 00:04:33,540
Поэтому, когда обещание будет разрешено,

64
00:04:33,540 --> 00:04:35,960
у вас будет кусок кода, который

65
00:04:35,960 --> 00:04:38,760
обрабатывает тот факт, что обещание было разрешено.

66
00:04:38,760 --> 00:04:40,455
Если обещание отклонено,

67
00:04:40,455 --> 00:04:43,985
вы также должны обработать эту ситуацию

68
00:04:43,985 --> 00:04:48,470
отклонением обещания соответственно в вашем коде.

69
00:04:48,470 --> 00:04:52,400
Таким образом, по этой причине всякий раз, когда вы создаете обещание,

70
00:04:52,400 --> 00:04:56,680
вы только указываете разрешение и варианты отклонения из него.

71
00:04:56,680 --> 00:05:02,905
Вариант разрешения обычно обрабатывается врачом, а затем вариант для вашего обещания.

72
00:05:02,905 --> 00:05:05,960
Так почему же мы используем обещания?

73
00:05:05,960 --> 00:05:08,060
Обещания используются, потому что он

74
00:05:08,060 --> 00:05:13,130
в значительной степени решает проблему обратного вызова, и обещания могут быть изменены.

75
00:05:13,130 --> 00:05:15,860
Например, если у вас есть одно обещание, которое, в

76
00:05:15,860 --> 00:05:20,690
свою очередь, вызывает вызов другому, который вернет обещание.

77
00:05:20,690 --> 00:05:26,525
Обработка обещания может быть изменена на дескриптор предыдущего обещания.

78
00:05:26,525 --> 00:05:28,315
Таким образом, вы можете иметь кучу,

79
00:05:28,315 --> 00:05:33,635
а затем вызовы, которые будут обрабатывать возврат значения.

80
00:05:33,635 --> 00:05:39,930
Теперь мы увидим использование этого в упражнении, которое следует за этой лекцией.

81
00:05:39,930 --> 00:05:42,275
Чтобы потреблять обещание,

82
00:05:42,275 --> 00:05:47,675
вы зарегистрируете соответствующую функцию обратного вызова,

83
00:05:47,675 --> 00:05:50,810
когда потребитель обещания будет уведомлен либо

84
00:05:50,810 --> 00:05:53,750
о выполнении, либо об отклонении обещания.

85
00:05:53,750 --> 00:05:59,860
Таким образом, обратные вызовы регистрируются через .then () в обещание.

86
00:05:59,860 --> 00:06:07,040
Вы будете использовать .catch (), чтобы поймать ошибки в обещании возврата.

87
00:06:07,040 --> 00:06:09,845
Теперь методы.then () можно

88
00:06:09,845 --> 00:06:15,205
объединить вместе, как вы увидите в следующем упражнении.

89
00:06:15,205 --> 00:06:19,730
В качестве примера вы обычно обрабатываете обещание,

90
00:06:19,730 --> 00:06:26,250
привязывая к значению обещания .then () и .catch ().