JavaScript非同步程式設計助手:Promise模式
非同步模式在Web程式設計中變得越來越重要,對於Web主流語言JavaScript來說,這種模式實現起來不是很利索,為此,許多JavaScript庫(比如 jQuery和Dojo、AngularJS)新增了一種稱為Promise的抽象(術語稱作Deferred模式)。通過這些庫,開發人員能夠在實際程式設計中使用Promise模式,每個Promise都擁有一個叫做then的唯一介面,當Promise失敗或成功時,它就會進行回撥。它代表了一種可能會長時間執行而且不一定必須完成的操作結果。這種模式不會阻塞和等待長時間的操作完成,而是返回一個代表了承諾的(promised)結果的物件。
本文我們將討論JavaScript庫(比如jQuery、AngularJS)是如何使用Promise模式的來處理非同步的,其實就是通過回撥的方式提供容錯支援。
下面讓我們來看看jQuery是如何操作的:
var $info = $("#info"); $.ajax({ url:"/echo/json/", data: { json: JSON.stringify({"name": "someValue"}) }, type:"POST", success: function(response) { $info.text(response.name); } });
在這個例子中,你可以看到當設定成功後會指定一個回撥,這並不是Promise,但卻是一種很好的回撥方式。當Ajax呼叫完成後,它便會執行success函式。根據庫所使用的非同步操作,你可以使用各種不同的回撥(即任務是否成功,都會進行回撥,做出響應)。使用Promise模式會簡化這個過程,非同步操作只需返回一個物件呼叫。這個Promise允許你呼叫一個叫做then的方法,然後讓你指定回撥的function(s)個數,下面讓我們來看看jQuery是如何建立Promise的:
var $info = $("#info"); $.ajax({ url: "/echo/json/", data: { json: JSON.stringify({ "name": "someValue" }) }, type: "POST" }) .then(function (response) { $info.text(response.name); });
有趣的是,ajax物件返回xhr物件實現Promise模式,所以我們可以呼叫then方法,這樣做的優勢是你可以鏈式呼叫,實現獨立操作,如下所示 :
var $info = $("#info"); $.ajax({ url: "/echo/json/", data: { json: JSON.stringify({ "name": "someValue" }) }, type: "POST" }) .then(function (response) { $info.text(response.name); }) .then(function () { $info.append("...More"); }) .done(function () { $info.append("...finally!"); });
由於許多庫都開始採用Promise模式,所以非同步操作會變的非常容易。但如果站在相反的角度思考,Promise將會是什麼樣子的呢?其中一個非常重要的模式是函式可以接受兩種功能,一個是成功時的回撥,另一個是失敗時的回撥。
var $info = $("#info"); $.ajax({ // Change URL to see error happen url: "/echo/json/", data: { json: JSON.stringify({ "name": "someValue" }) }, type: "POST" }) .then(function (response) { // success $info.text(response.name); }, function () { // failure $info.text("bad things happen to good developers"); }) .always(function () { $info.append("...finally"); });
需要注意的是,在jQuery裡,無論成功還是失敗,我們都會使用一個呼叫來指定我們想要呼叫的。下面讓來看看AngularJS是如何使用Promise模式的:
var m = angular.module("myApp", []); m.factory("dataService", function ($q) { function _callMe() { var d = $q.defer(); setTimeout(function () { d.resolve(); //defer.reject(); }, 100); return d.promise; } return { callMe: _callMe }; }); function myCtrl($scope, dataService) { $scope.name = "None"; $scope.isBusy = true; dataService.callMe() .then(function () { // Successful $scope.name = "success"; }, function () { // failure $scope.name = "failure"; }) .then(function () { // Like a Finally Clause $scope.isBusy = false; }); }
你可以在JSFiddle裡試試這些例子,並且看看會產生哪些效果。使用Promise來操作非同步是一種非常簡單的方式,而且還可以簡化你的程式碼,豈不是一舉兩得的好方法。
更多關於Promise的介紹及示例,可以前往官網檢視。
英文來源:JavaScript Promise
相關文章
- JavaScript非同步程式設計的Promise模式JavaScript非同步程式設計Promise模式
- 前端- JavaScript非同步程式設計Promise前端JavaScript非同步程式設計Promise
- 非同步程式設計---Promise非同步程式設計Promise
- javascript promise程式設計JavaScriptPromise程式設計
- JavaScript深入淺出非同步程式設計二、promise原理JavaScript非同步程式設計Promise
- JavaScript非同步程式設計(1)- ECMAScript 6的Promise物件JavaScript非同步程式設計Promise物件
- Javascript非同步程式設計模型進化,從promise到generatorJavaScript非同步程式設計模型Promise
- JS非同步程式設計之PromiseJS非同步程式設計Promise
- 學習Promise非同步程式設計Promise非同步程式設計
- ES6 Promise非同步程式設計Promise非同步程式設計
- promise設計模式Promise設計模式
- Javascript 非同步程式設計JavaScript非同步程式設計
- JavaScript非同步程式設計JavaScript非同步程式設計
- 非同步程式設計方案----Promise實現小解非同步程式設計Promise
- 探索Javascript非同步程式設計JavaScript非同步程式設計
- JavaScript非同步程式設計史:回撥函式到Promise到Async/AwaitJavaScript非同步程式設計函式PromiseAI
- 三種Javascript(NodeJS)非同步程式設計程式碼模式比較JavaScriptNodeJS非同步程式設計模式
- promise-java非同步程式設計解決方案PromiseJava非同步程式設計
- Promise是如何實現非同步程式設計的?Promise非同步程式設計
- ES6 非同步程式設計之二:Promise非同步程式設計Promise
- Promise-在Java中以同步的方式非同步程式設計PromiseJava非同步程式設計
- javascript非同步與promiseJavaScript非同步Promise
- 【併發程式設計】Future模式新增Callback及Promise 模式程式設計模式Promise
- 你好,JavaScript非同步程式設計—- 理解JavaScript非同步的美妙JavaScript非同步程式設計
- 你好,JavaScript非同步程式設計---- 理解JavaScript非同步的美妙JavaScript非同步程式設計
- python 網路程式設計----非阻塞或非同步程式設計Python程式設計非同步
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 非同步程式設計:基於事件的非同步程式設計模式(EAP)非同步程式設計事件設計模式
- 向非程式設計師解釋JavaScript程式設計師JavaScript
- 向非程式設計師解釋 JavaScript程式設計師JavaScript
- Javascript中的非同步程式設計JavaScript非同步程式設計
- JavaScript非同步程式設計筆記JavaScript非同步程式設計筆記
- Javascript非同步程式設計總結JavaScript非同步程式設計
- 談談 JavaScript 非同步程式設計JavaScript非同步程式設計
- JavaScript 非同步程式設計入門JavaScript非同步程式設計
- JS非同步程式設計 (2) – Promise、Generator、async/awaitJS非同步程式設計PromiseAI
- Socket程式設計中的同步、非同步、阻塞和非阻塞(轉)程式設計非同步
- 鴻蒙程式設計江湖:非同步程式設計的優勢及 Promise的應用鴻蒙程式設計非同步Promise