Когда весь мир говорит: «Вау! Обещания — это круто!», а вы недоумеваете: «Почему это круто?», я тоже так же недоумевал. Когда вы спрашиваете их, почему, и они бросают вам несколько слов, таких как «асинхронный», «JavaScript является однопоточным», и вы смотрите на них, спрашивая: «А что, если Javascript является однопоточным ??», тогда присоединяйтесь к клубу!

Давайте посмотрим на обещания сверху донизу. Давайте также попробуем выполнить фрагменты в plunkr/jsfiddle, чтобы лучше понять.

doThisFirst().then(function(resultOfFirst){

сделать этоследующим(результатпервого);

});

функция doThisFirst(){

вернуть $.getJSON("sample.json");

}

Подождите, когда мы посмотрим на это, не похоже ли это на синхронный поток выполнения?

var resultOfFirst = doThisFirst(); сделать этоследующее(результатпервого);

Но, к сожалению, этот «resultOfFirst» остается неопределенным. Поскольку javascript продолжает выполняться, не дожидаясь чтения файла «sample.json».

Когда мы откладываем выполнение, это может работать нормально.

функция doThisFirst(){

var resultOfFirst = $.getJSON("sample.json");
window.setTimeout(function (){

alert("через несколько секунд");
alert(JSON.stringify(resultOfFirst) + "данные чтения файла");

}, 2000)

alert("это предупреждение до истечения времени ожидания");

}

Почему это работает сейчас? Javascript не ждет завершения вызова службы и продолжает выполняться. Javascript имеет единую очередь, в которой события ожидают выполнения. В нашем случае после установки времени ожидания javascript продолжает выполнять последующие части кода, и через 2 секунды извлекается файл «sample.json», который отправляет свой результат в очередь событий. Javascript теперь берется из очереди событий и начинает выполняться. Вот почему люди говорят, что javascript является однопоточным. Имеет единственную очередь, которую он ожидает. Но этот 2-секундный тайм-аут может не быть одинаковым все время. Так что этот тайм-аут немного опасен и непредсказуем.

Этот фрагмент кода можно сделать проще и менее опасным.

function doThisFirst(){ $.getJSON("sample.json", function(resultOfReadingTheJSON){

сделать этоследующим(resultOfReadingTheJSON);

}) }

or

обратный вызов функции(resultOfReadingJSON){ doThisNext(resultOfReadingJSON);

функция doThisFirst(){

$.getJSON(“sample.json”, обратный вызов);

}

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

Если бы мы могли связать функцию обратного вызова с чем-то в нашей реальной жизни, это были бы наши контактные данные. Допустим, мы просим нашего друга достать для нас золотое кольцо. После того, как она получит его, мы хотели бы проверить чистоту золотого кольца. Нашему другу может потребоваться некоторое время, чтобы пойти в магазин и купить его. Очевидно, мы хотели бы продолжить наши задачи и получить уведомление, когда она будет готова с кольцом. Поэтому мы даем ей наши контактные данные, чтобы перезвонить нам.

Сказав все это, как это поможет нам понять обещания? Когда у нас есть вложенные обратные вызовы и зависимости, может быть очень сложно обрабатывать сценарии ошибок (пирамида гибели). Следовательно, мы используем промисы для лучшей читабельности, понимания и отладки (чистого кода).

В мире промисов вместо тайм-аутов у нас есть статусы. Возможные статусы обещания могут быть,

1. Отложено(ожидание результата)

2. Решено (с успехом)
3. Решено (с ошибкой)

Примерно так будет выглядеть внутренняя часть промиса:

функция MimicPromise(обработчик) {

var status = «отложено»; var data = «еще не установлено»; function resolve(dataFromResponse) { // решено и успешно console.log("в разрешении"); данные = данные из ответа; статус = «решено»; } function reject(err) { //решено и ошибка

console.log("отклонено");

данные = "ошибка и отказ"; статус = «решено»;

обработчик(разрешить, отклонить);

this.then = function(done){ if(status == «решено»){

console.log(статус + «статус»); сделано (данные); }

}

function doThisFirst(){ return new MimicPromise(function(resolve, reject) { $.getJSON("sample.json", function(data){

если(данные){

разрешить(данные)

} иначе{

отклонить(данные);

} }) }) };

doThisFirst().then(function(resultOfFirst){ console.log(JSON.stringify(resultOfFirst));
});

В этом случае, если мы вообще попытаемся получить доступ к ответу до того, как он будет разрешен, «статус» будет «отложен», а данные ответа останутся неустановленными.

Надеюсь это поможет :).