Прежде чем начать официальное введение, мы хотим посмотреть, как выглядит обещание JavaScript:
Кода -копия выглядит следующим образом:
var p = новое обещание (function (Resolve, dize) {
Resolve ("Привет, мир");
});
P.Then (function (str) {
предупреждение (str);
});
1. Затем () возвращает раздвоенное обещание
В чем разница между следующими двумя кодами?
Кода -копия выглядит следующим образом:
// Приложение а
var p = новое обещание (/* ...*/);
P.Then (Func1);
P.Then (Func2);
// Приложение б
var p = новое обещание (/* ...*/);
P.Then (Func1)
.then (func2);
Если вы тщательно рассмотрите два вышеупомянутых эквивалентных кода, то обещания-это просто одномерный массив функций обратного вызова. Однако это не так. Каждый тогда () вызов возвращает раздвоенное обещание. Следовательно, в экспонате, если func1 () бросает исключение, func2 () все еще называется нормально.
В ExhiTB, если func1 () бросает ошибку, func2 () не будет вызвано, потому что первый вызов возвращает новое обещание, которое будет отклонен в func1 (). Результатом является пропущенный func2 ().
Резюме: Обещания могут быть разветвлены по нескольким путям, аналогично сложным блок -схемам.
2. Обратный вызов должен пройти результат
Что получит предупреждение, когда вы запустите следующий код?
Кода -копия выглядит следующим образом:
var p = новое обещание (function (Resolve, dize) {
Resolve ("Привет, мир");
});
P.Then (function (str) {})
.then (function (str) {
предупреждение (str);
});
Предупреждение во втором тогда () ничего не показывает. Это связано с тем, что функция обратного вызова, в контексте обещания, нет никакой функции обратного вызова, поскольку результат меняется. Обещание ожидает, что ваш обратный вызов вернет тот же результат или результат замены, который затем передается следующему обратному обращению.
Аналогично использованию AdPater для изменения результатов следующим образом:
Кода -копия выглядит следующим образом:
var featsTometres = function (ft) {return ft*12*0,0254};
var p = новое обещание (/* ...*/);
P.Then (Feettometres)
.then (function (метры) {
бдительность (метры);
});
3. только исключения из предыдущего слоя могут быть пойманы
В чем разница между этими двумя частями кода?
Кода -копия выглядит следующим образом:
// Приложение а
Новое обещание (функция (Resolve, duce) {
Resolve ("Привет, мир");
})
.затем(
function (str) {
бросить новую ошибку ("э -э -э -э");
},
неопределенный
)
.затем(
неопределенный,
функция (ошибка) {
оповещение (ошибка);
}
);
// Приложение б
Новое обещание (функция (Resolve, Office) {
Resolve ("Привет, мир");
})
.затем(
function (str) {
бросить новую ошибку ("э -э -э -э");
},
функция (ошибка) {
оповещение (ошибка);
}
);
В первом фрагменте кода исключение в первом () брошено и будет пойман вторым тогда (), и будет запускается предупреждение «uh oh». Это руководство только исключения на предыдущем уровне будут пойманы.
Во втором фрагменте кода функция обратного вызова и функция обратного вызова ошибки находятся на одном уровне, что означает, что, когда исключение будет брошено в обратный вызов, оно не будет пойман. Фактически, обратный вызов ошибки второго кода будет брошен только в том случае, если обещание будет отклонено или если само обещание неверно.
4. Ошибки могут быть восстановлены
В функции обратного вызова ошибки, если вы не переопределяете ошибку, обещание предполагает, что вы восстановились от ошибки и перевернули в разрешенное состояние. В следующем примере «Я сохранен» будет отображаться, потому что обратный вызов ошибки в первом () не переиздавал исключение.
Кода -копия выглядит следующим образом:
var p = новое обещание (function (Resolve, dize) {
отклонить (новая ошибка ("pebkac"));
});
P.Then (
неопределенный,
функция (ошибка) {}
)
.затем(
function (str) {
оповещение («Я спасен!»);
},
функция (ошибка) {
оповещение («Плохой компьютер!»);
}
);
Обещание можно рассматривать как слой на луке. Каждый тогда () добавляет другой уровень к луку. Каждый уровень представляет собой обработанную деятельность. Когда иерархия закончена, результат считается фиксированным и готовым к следующей иерархии.
5. Обещания могут быть приостановлены
Поскольку вы готовы выполнить в одном методе (), это не означает, что вы не можете сделать паузу и запустить другой заранее. Чтобы приостановить текущее обещание или позволить ему ждать еще одного обещания, просто верните другое обещание в Then ().
Кода -копия выглядит следующим образом:
var p = новое обещание (/* ...*/);
P.Then (function (str) {
if (! loggedin) {
вернуть новое обещание (/* ...*/);
}
})
.then (function (str) {
оповещение («сделано»);
})
В предыдущем коде подсказка не появится до тех пор, пока новое обещание не будет проанализировано. Это удобный способ ввести больше зависимостей в существующем асинхронном пути кода. Например, вы можете обнаружить, что у пользовательского сеанса есть тайм -аут, и вы можете инициализировать второй вход, прежде чем продолжить предыдущий путь кода.
6. Решенные обещания не будут выполнены немедленно
Получите ли вы поле при привлечении при запуске следующего кода?
Кода -копия выглядит следующим образом:
функция runme () {
var i = 0;
Новое обещание (функция (Resolve) {
решать();
})
.then (function () {
i += 2;
});
оповещение (i);
}
Поскольку обещание проанализировано немедленно, а затем () метод выполняется немедленно, вы можете подумать, что подсказка 2 будет исследована. Тем не менее, определение обещания требует, чтобы все вызовы были принуждены к асинхронному. Следовательно, подсказка будет сгенерирована до того, как она будет изменена.