Режим программирования обещания также называется затем, который можно понимать как выполнение после задержки. Каждое обещание имеет уникальный интерфейс, который тогда называется, и когда обещание не удается или удастся, оно сделает обратный вызов. Он представляет собой результат операции, который может работать в течение длительного времени и не обязательно должен быть завершен. Этот шаблон не блокирует и не ожидает завершения долгосрочных операций, но возвращает объект, который представляет обещанный результат.
Многие текущие библиотеки JavaScript (такие как jquery и dojo, angularjs) добавляют эту абстракцию под названием обещание. Через эти библиотеки разработчики могут использовать режим обещания в реальном программировании.
Ниже мы будем использовать jQuery в качестве примера для обсуждения того, как библиотеки JavaScript используют режим обещания для обработки асинхронной обработки, которая на самом деле предназначена для обеспечения постоянной поддержки с помощью обратных вызовов. Когда операция преуспевает, не удается или в любом случае выполняется соответствующий обратный вызов, и попытаться обработать любые возможные ситуации в определенной части логики.
Во -первых, давайте посмотрим, как jQuery обычно работает:
Кода -копия выглядит следующим образом:
var $ info = $ ("#info");
$ .ajax ({
URL: "/echo/json/",
Data: {json: json.stringify ({"name": "somevalue"})},
Тип: "post",
Успех: функция (ответ)
{
$ info.text (response.name);
}
});
В этом примере вы можете видеть, что когда настройка будет успешной, будет указан обратный вызов, который является хорошим методом обратного вызова. Это не обещание, и официальная документация JQuery больше не рекомендует этот метод (http://api.jquery.com/jquery.ajax/#jqxhr). Когда вызов Ajax завершается, он выполняет функцию успеха. В зависимости от асинхронных операций, используемых библиотекой, вы можете использовать различные обратные вызовы (то есть, является ли задача успешной или нет, она будет вызвана обратно и отвечает). Использование режима обещания упрощает этот процесс, асинхронные операции требуют только возврата объектного вызова. Это обещание позволяет вам вызвать метод, вызванный затем, а затем позволяет указать количество функций (ы) обратного вызова.
Давайте посмотрим, как jQuery строит обещание:
Кода -копия выглядит следующим образом:
var $ info = $ ("#info");
$ .ajax ({
URL: "/echo/json/",
данные: {
json: json.stringify ({
"Имя": "SomeValue"
})
},
Тип: "post"
})
.then (function (ответ) {
$ info.text (response.name);
});
Объект jQuery Ajax реализует режим обещания, возвращая объект XHR, поэтому мы можем вызвать метод тогдашнего. Преимущество этого заключается в том, что вы можете цепорить вызовы и реализовать независимые операции, как показано ниже:
Кода -копия выглядит следующим образом:
var $ info = $ ("#info");
$ .ajax ({
URL: "/echo/json/",
данные: {
json: json.stringify ({
"Имя": "SomeValue"
})
},
Тип: "post"
})
.then (function (ответ) {
$ info.text (response.name);
})
.then (function () {
$ info.append ("... больше");
})
.done (function () {
$ info.append ("... наконец!");
});
Асинхронные операции становятся очень простыми, поскольку многие библиотеки начинают использовать режим обещания. Но если вы думаете с противоположной точки зрения, как будет выглядеть обещание? Одним из очень важных шаблонов является то, что функция может принимать две функции, одна из них является обратным вызовом, а другая - обратный вызов при сбое.
Кода -копия выглядит следующим образом:
var $ info = $ ("#info");
$ .ajax ({
// Измените URL, чтобы увидеть ошибку
URL: "/echo/json/",
данные: {
json: json.stringify ({
"Имя": "SomeValue"
})
},
Тип: "post"
})
.then (function (ответ) {
// успех
$ info.text (response.name);
},
function () {
// отказ
$ info.text («Плохие вещи случаются с хорошими разработчиками»);
})
.lways (function () {
$ info.append ("... наконец");
});
Следует отметить, что в JQUERY, будь то успешным или неудачным, мы будем использовать звонок, чтобы указать, что мы хотим позвонить.
Фактически, вы также можете написать это здесь, что также является рекомендуемым методом в официальном документе jQuery:
Кода -копия выглядит следующим образом:
var $ info = $ ("#info");
$ .ajax ({
// Измените URL, чтобы увидеть ошибку
URL: "/echo/json/",
данные: {
json: json.stringify ({
"Имя": "SomeValue"
})
},
Тип: "post"
})
.done (function (ответ) {
// успех
$ info.text (response.name);
}). fail (function () {
// отказ
$ info.text («Плохие вещи случаются с хорошими разработчиками»);
})
.lways (function () {
$ info.append ("... наконец");
});
Давайте посмотрим, как AngularJS использует режим обещания:
Кода -копия выглядит следующим образом:
var m = angular.module ("myApp", []);
M.Factory ("DataService", функция ($ Q) {
function _callme () {
var d = $ q.defer ();
settimeout (function () {
d.resolve ();
//defer.reject ();
}, 100);
возврат D.promise;
}
возвращаться {
Callme: _callme
};
});
Функция myctrl ($ scope, dataService) {
$ scope.name = "нет";
$ scope.isbusy = true;
dataService.callme ()
.then (function () {
// Успешный
$ scope.name = "успех";
},
function () {
// отказ
$ scope.name = "неудача";
})
.then (function () {
// как пункт наконец -то
$ scope.isbusy = false;
});
}
Вы можете попробовать эти примеры в JSFiddle и посмотреть, какие эффекты будут созданы. Использование обещания управлять асинхронным - очень простой способ, и это также может упростить ваш код. Это действительно хороший способ убить двух птиц одним камнем.
Для получения дополнительной информации и примеров о обещании вы можете перейти на официальный сайт (http://www.promisejs.org/).