angularjs的callback(AngularJS表達式)

本文目錄一覽:

angularjs使用jsonp跨域報錯success_jsonpCallback is not defined

jsonp非同步請求是執行了A後,不管A是否執行成功都可以再往下繼續執行B,C,D;succes

angularjs的¥q的用法

在用JQuery的時候就知道 promise 是 Js非同步編程模式的一種模式,但是不是很明白他跟JQuery的deferred對象有什麼區別。隨著公司項目的進行,要跟後台接數據了,所以決定搞定它。

Promise

Promise是一種模式,以同步操作的流程形式來操作非同步事件,避免了層層嵌套,可以鏈式操作非同步事件。

我們知道,在編寫javascript非同步代碼時,callback是最最簡單的機制,可是用這種機制的話必須犧牲控制流、異常處理和函數語義化為代價,甚至會讓我們掉進出現callback大坑,而promise解決了這個問題。

ES6中Promise、angularJS內置的AngularJS內置Q,以及when採用的都是Promises/A規範,如下:

每個任務都有三種狀態:未完成(pending)、完成(fulfilled)、失敗(rejected)。

1.pending狀態:可以過渡到履行或拒絕狀態。

2.fulfilled狀態:不能變為其他任何狀態,而且狀態不能改變,必須有value值。

3.rejected狀態:不能變為其他任何狀態,而且狀態不能改變,必須有reason。

狀態的轉移是一次性的,狀態一旦變成fulfilled(已完成)或者failed(失敗/拒絕),就不能再變了。

複製代碼代碼如下:

function okToGreet(name){

return name === ‘Robin Hood’;

}

function asyncGreet(name) {

var deferred = $q.defer();

setTimeout(function() {

// 因為這個非同步函數fn在未來的非同步執行,我們把代碼包裝到 $apply 調用中,一邊正確的觀察到 model 的改變

$scope.$apply(function() {

deferred.notify(‘About to greet ‘ + name + ‘.’);

if (okToGreet(name)) {

deferred.resolve(‘Hello, ‘ + name + ‘!’);

} else {

deferred.reject(‘Greeting ‘ + name + ‘ is not allowed.’);

}

});

}, 1000);

return deferred.promise;

}

var promise = asyncGreet(‘Robin Hood’);

promise.then(function(greeting) {

alert(‘Success: ‘ + greeting);

}, function(reason) {

alert(‘Failed: ‘ + reason);

}, function(update) {

alert(‘Got notification: ‘ + update);

});

Q Promise的基本用法

上面代碼表示, $q.defer() 構建的 deffered 實例的幾個方法的作用。如果非同步操作成功,則用resolve方法將Promise對象的狀態變為「成功」(即從pending變為resolved);如果非同步操作失敗,則用reject方法將狀態變為「失敗」(即從pending變為rejected)。最後返回 deferred.promise ,我們就可以鏈式調用then方法。

JS將要有原生Promise,ES6中已經有Promise對象,firefox和Chrome 32 beta版本已經實現了基本的Promise API

AngularJs中的$q.defferd

通過 調用 $q.defferd 返回deffered對象以鏈式調用。該對象將Promises/A規範中的三個任務狀態通過API關聯。

deffered API

deffered 對象的方法

1.resolve(value):在聲明resolve()處,表明promise對象由pending狀態轉變為resolve。

2.reject(reason):在聲明resolve()處,表明promise對象由pending狀態轉變為rejected。

3.notify(value) :在聲明notify()處,表明promise對象unfulfilled狀態,在resolve或reject之前可以被多次調用。

deffered 對象屬性

promise :最後返回的是一個新的deferred對象 promise 屬性,而不是原來的deferred對象。這個新的Promise對象只能觀察原來Promise對象的狀態,而無法修改deferred對象的內在狀態可以防止任務狀態被外部修改。

Promise API

當創建 deferred 實例時會創建一個新的 promise 對象,並可以通過 deferred.promise 得到該引用。

promise 對象的目的是在 deferred 任務完成時,允許感興趣的部分取得其執行結果。

promise 對象的方法

1.then(errorHandler, fulfilledHandler, progressHandler):then方法用來監聽一個Promise的不同狀態。errorHandler監聽failed狀態,fulfilledHandler監聽fulfilled狀態,progressHandler監聽unfulfilled(未完成)狀態。此外,notify 回調可能被調用 0到多次,提供一個進度指示在解決或拒絕(resolve和rejected)之前。

2.catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式

3.finally(callback) ——讓你可以觀察到一個 promise 是被執行還是被拒絕, 但這樣做不用修改最後的 value值。 這可以用來做一些釋放資源或者清理無用對象的工作,不管promise 被拒絕還是解決。 更多的信息請參閱 完整文檔規範.

通過then()方法可以實現promise鏈式調用。

複製代碼代碼如下:

promiseB = promiseA.then(function(result) {

return result + 1;

});

// promiseB 將會在處理完 promiseA 之後立刻被處理,

// 並且其 value值是promiseA的結果增加1

$q的其他方法

$q.when(value):傳遞變數值,promise.then()執行成功回調

$q.all(promises):多個promise必須執行成功,才能執行成功回調,傳遞值為數組或哈希值,數組中每個值為與Index對應的promise對象

如何運行angularjs應用

 如何利用AngularJS服務接入外部API

除了輕鬆對HTML進行擴展的能力之外,AngularJS還提供一套簡便途徑、幫助我們與外部API實現交互。在今天的教程中,我們將共同探討如何利用其服務與GitHub的API相對接,進而創建一套簡單的庫瀏覽器。

第一步:準備工作

我們就以下面這套基礎HTML模板為起點:

!DOCTYPE html html head titleGitHub Search/title /head body /body /html

現在將AngularJS腳本添加到該文檔的head當中:

script src=””/script

在此之後,我們可以在將這套CCS樣式添加到行內或者獨立的文件當中:

* { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; font-family: sans-serif; } body, html { margin: 0; } p { margin: 0; } input { width: 100%; } pre { white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word; } div.repo { border-bottom: 1px solid; cursor: pointer; } #search, #repo, #user { float: left; } #search { width: 20%; } #repo { width: 60%; } #user { width: 20%; }

如大家所見,其中不存在任何多餘的內容、只保留最基礎的布局方案——將搜索欄置於右側、庫信息位於中央、用戶庫同樣置於右側。我們還需要將對應代碼行打包至pre標籤當中,此後我們還要利用它顯示README文件內容——因為這些內容通常來自GitHub Flavored Markdown、而且其中一部分代碼行與用戶庫列表存在重疊。

當然,大家可以向其中添加更多樣式以提升成果的視覺效果——但請注意,本教程中的截圖都採取最基本的外觀設計。

大家可以未來需要編寫的JavaScript代碼置於本文檔的head當中或者為其建立獨立文件,但獨立文件仍然需要處於AngularJS腳本之下。

第二步:模塊

現在我們可以為自己的應用程序創建一個模塊:

var app = angular.module(‘githubsearch’, []);

接下來利用ngApp指令將其添加到body標籤當中:

body ng-app=”githubsearch”

第三步:控制器

我們還需要為自己的應用程序準備一套控制器。為了簡化創建流程,我們將只為應用準備一套控制器,這樣我們就不必考慮如何在不同控制器之間進行信息傳遞了:

app.controller(‘SearchController’, function SearchController($scope) { });

第四步:基礎服務

我們需要對自己的GitHub服務進行定義:

app.factory(‘GitHub’, function GitHub($http) { return { }; });

我們將使用app.factory()方法,這樣就能保證返回對象附帶幾個以後將會用到的方法。我們將使用$http服務從GitHub的API中獲取數據。

第五步:搜索庫

我們服務中的第一項方法負責利用GitHub API對庫進行搜索。使用服務非常簡單(這項函數能夠進入由製造函數返回的對象):

searchRepos: function searchRepos(query, callback) { $http.get(”, { params: { q: query } }) .success(function (data) { callback(null, data); }) .error(function (e) { callback(e); }); }

$http.get()方法是執行GET請求的一種捷徑。第一條參數是我們希望訪問的URL。第二條參數則代表一個具備選項的對象。這裡我們只需要params對象——它是一個查詢參數散列,將被添加到該請求當中(其中q參數屬於搜索字元串,大家可以點擊此處了解更多相關信息)。

$http.get()會返回一項承諾。我們可以將監聽器附加在success()與error()上,並且據此調用回調函數。

第六步:搜索欄

為了使用我們在之前幾步中定義完成的函數,我們需要在自己的HTML當中添加搜索欄。相關代碼非常簡單,如下所示:

div id=”search” input ng-model=”query” placeholder=”search” ng-keyup=”$event.keyCode == 13 executeSearch()” div class=”repo” ng-repeat=”repo in repos” ng-click=”openRepo(repo.full_name)” strong{{ repo.full_name }}/strong p{{ repo.description }}/p /div /div

我們使用ngModel指令將該輸入欄中的值指向至Scope query變數,並在用戶按下回車鍵後利用ngKeyup調用executeSearch()函數(這樣$event.keyCode == 13就會進行比較)。我們無法在AngularJS表達式中使用條件語句,但一條簡單的邏輯運算符(AND)足以很好地完成這項任務。

在輸入域下面,我們使用ngRepeat來顯示搜索結果。我們將顯示該庫的完整名稱與描述(如果需要顯示其它不同內容,大家可以點擊此處查看GitHub API說明文檔中的可用域)。

我們還使用ngClick通過該庫的完整名稱來調用openRepo()函數,這樣我們就能顯示與之相關的信息。我們稍後再對該函數進行定義。

第七步:使用搜索功能

現在我們終於可以使用自己創建完成的服務了。首先,將GitHub參數添加至控制器函數(這樣該服務就能被注入到AngularJS當中):

app.controller(‘SearchController’, function SearchController($scope) {

現在定義executeSearch()函數:

$scope.executeSearch = function executeSearch() { GitHub.searchRepos($scope.query, function (error, data) { if (!error) { $scope.repos = data.items; } }); }

如大家所見,我們利用來自$scope.query的搜索字元串從當中調用GitHub.searchRepos(),而後在回調中將搜索結果(來自data.items)加入$scope.repos變數。

只要執行以上步驟,我們就能順利顯示出搜索結果。在瀏覽器中打開我們的HTML文件並嘗試進行搜索:

第八步:獲取庫中的數據

現在我們已經獲得了搜索功能,可以顯示出庫中用戶所選定的信息內容。下面我們再創建一條函數,旨在通過自己的服務獲取來自庫的數據:

getRepo: function getRepo(name, callback) { $http.get(”+ name) .success(function (data) { callback(null, data); }) .error(function (e) { callback(e); }); }

被傳遞至此函數的名稱必須為完整名稱(結構為:作者名稱、斜杠、庫名稱——例如angular/angular.js),這是因為我們需要將其傳遞至GitHub

API(點擊此處查看更多說明)。

第九步:獲取庫中的README文件

README文件中的內容並未被包含在我們利用以上函數獲取到的數據當中。相反,大家需要利用另一個API進行調用及獲取,因此我們需要創建以下函數:

getReadme: function getReadme(name, callback) { $http.get(”+ name +’/readme’) .success(function (data) { callback(null, atob(data.content)); }) .error(function (e) { callback(e); }); }

這條函數與之前我們創建完畢的兩條基本相同,只不過對URL進行了變更。我們還要利用atob()函數解碼README文件的內容,因為它採用base64編碼機制。大家可以點擊此處查看GitHub

API說明文檔中與獲取README文件內容相關的信息。

我們之所以沒有將這兩條請求塞進同一個函數當中,是因為某些庫根本不具備 README文件。如果我們將二者強行結合,應用程序可能因此發生故障。

第十步:顯示庫信息

我們將在另一個元素div當中顯示庫的完整名稱、查看過該庫的人數以及README文件:

div id=”repo” ng-show=”activeRepo” strong{{ activeRepo.full_name }}/strong emWatched by {{ activeRepo.watchers_count }} people./em pre{{ activeRepo.readme }}/pre /div

我們將把該信息保存在控制器Scope內的activeRepo變數當中。只要存在可以顯示的數據,ngShow就會將該元素顯示出來(如果不存在可以顯示的數據,我們將只能看到『Watched

by people』文本,而且沒有任何庫被選中)。

第十一步:更新控制器

我們還需要對控制器進行更新,從而保證其切實獲取到庫數據並將其納入Scope當中。下面創建我們之前附加至ngClick指令的openRepo()函數:

$scope.openRepo = function openRepo(name) { GitHub.getRepo(name, function (error, data) { if (!error) { $scope.activeRepo = data; GitHub.getReadme(name, function (error, data) { if (!error) { $scope.activeRepo.readme = data; } else { $scope.activeRepo.readme = ‘No README found!’; } }); } }); }

如大家所見,我們首先使用GitHub.getRepo()方法、檢查錯誤而後將該數據引入activeRepo變數。接下來,我們獲取README文件——如果該文件不存在,我們需要向用戶提示該情況。

現在大家可以再次運行自己的應用程序並查看其實際效果:

第十二步:獲取用戶的庫

為了將更多功能引入到我們的應用程序當中,我們將為屏幕右方已被選定庫的持有者顯示其所有可用庫。這要求我們向服務中引入另一個方法:

getUserRepos: function getUser(name, callback) { $http.get(”+ name +’/repos’) .success(function (data) { callback(null, data); }) .error(function (e) { callback(e); }); }

其內容與此前的幾條幾乎無甚差別(大家可以點擊此處查看更多與此API請求相關的信息)。

第十三步:顯示用戶的庫

這基本上相當於重現HTML中的搜索欄機制,不過我們實際需要顯示的是用戶名稱與user對象中的庫,而非輸入域或者Scope本身:

div id=”user” strong{{ user.login }}/strong div class=”repo” ng-repeat=”repo in user.repos” ng-click=”openRepo(repo.full_name)” strong{{ repo.name }}/strong p{{ repo.description }}/p /div /div

到了這一步,大家應該已經擁有了一套能夠切實運作的AngularJS應用程序——它可以根據搜索字元串獲取GitHub庫。大家可以進一步對其進行迭代,例如向其中添加更多功能或者為其設計完全不同的外觀樣式。

轉載,僅供參考,祝你愉快,滿意請採納。 

AngularJS如何調用外部介面?

第一步:準備工作

 將AngularJS腳本添加到該文檔的當中:

在此之後,可以在將這套CCS樣式添加到行內或者獨立的文件當中:

*{

-webkit-box-sizing:border-box;

-moz-box-sizing:border-box;

box-sizing:border-box;

font-family:sans-serif;

}

body,html{margin:0;}

p{margin:0;}

input{width:100%;}

pre{

white-space:pre-wrap;

white-space:-moz-pre-wrap;

white-space:-pre-wrap;

white-space:-o-pre-wrap;

word-wrap:break-word;

}

div.repo{

border-bottom:1pxsolid;

cursor:pointer;

}

#search,#repo,#user{float:left;}

#search{width:20%;}

#repo{width:60%;}

#user{width:20%;}

如大家所見,其中不存在任何多餘的內容、只保留最基礎的布局方案——將搜索欄置於右側、庫信息位於中央、用戶庫同樣置於右側。我們還需要將對應代碼行打包至標籤當中,此後我們還要利用它顯示README文件內容——因為這些內容通常來自GitHub Flavored Markdown、而且其中一部分代碼行與用戶庫列表存在重疊。

當然,大家可以向其中添加更多樣式以提升成果的視覺效果——但請注意,本教程中的截圖都採取最基本的外觀設計。

大家可以未來需要編寫的JavaScript代碼置於本文檔的當中或者為其建立獨立文件,但獨立文件仍然需要處於AngularJS腳本之下。

第二步:模塊

現在我們可以為自己的應用程序創建一個模塊:

varapp=angular.module(‘githubsearch’,[]);

接下來利用ngApp指令將其添加到標籤當中:

第三步:控制器

我們還需要為自己的應用程序準備一套控制器。為了簡化創建流程,我們將只為應用準備一套控制器,這樣我們就不必考慮如何在不同控制器之間進行信息傳遞了:

app.controller(‘SearchController’,functionSearchController($scope){

});

第四步:基礎服務

我們需要對自己的GitHub服務進行定義:

app.factory(‘GitHub’,functionGitHub($http){

return{

};

});

我們將使用app.factory()方法,這樣就能保證返回對象附帶幾個以後將會用到的方法。我們將使用$http服務從GitHub的API中獲取數據。

第五步:搜索庫

我們服務中的第一項方法負責利用GitHub API對庫進行搜索。使用服務非常簡單(這項函數能夠進入由製造函數返回的對象):

searchRepos:functionsearchRepos(query,callback){

$http.get(”,{params:{q:query}})

.success(function(data){

callback(null,data);

})

.error(function(e){

callback(e);

});

}

$http.get()方法是執行GET請求的一種捷徑。第一條參數是我們希望訪問的URL。第二條參數則代表一個具備選項的對象。這裡我們只需要params對象——它是一個查詢參數散列,將被添加到該請求當中(其中q參數屬於搜索字元串,大家可以點擊此處了解更多相關信息)。

$http.get()會返回一項承諾。我們可以將監聽器附加在success()與error()上,並且據此調用回調函數。

第六步:搜索欄

為了使用我們在之前幾步中定義完成的函數,我們需要在自己的HTML當中添加搜索欄。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/244421.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:02
下一篇 2024-12-12 13:02

相關推薦

  • 關係表達式的深度剖析

    一、關係表達式的定義 關係表達式是指在關係資料庫中為實現數據的最大效用和最快速度的數據檢索和存儲而定義的語法,表達式中的每一個元素(關係、屬性、常量等)均是資料庫的基本結構。 二、…

    編程 2025-04-23
  • Java二元表達式:從基礎到優化

    一、基礎知識 Java二元表達式是指只有兩個操作數以及一個運算符的表達式,例如1+2、a<b或 x*y 。在Java語言中,對二元表達式的處理十分重要且廣泛,我們需要掌握基礎…

    編程 2025-04-18
  • 切面表達式:細節決定成敗

    一、切面表達式註解 註解是Java中非常重要的一種語法標記,Spring AOP中也通過註解的方式來定義切面。在定義切面時,可以使用@Aspect註解表示一個切面類,也可以使用@B…

    編程 2025-04-13
  • Cron表達式校驗詳解

    一、Cron表達式簡介 Cron表達式是一種時間計劃工具。它是由6或7個時間元素組成的字元串,用於指定時間表。 Cron觸發器通常用於調度任務或批處理作業。 Cron表達式是指定執…

    編程 2025-04-12
  • 深入探究cron表達式驗證

    一、驗證cron表達式的重要性 1、cron表達式是一個非常常見的工具,用於定義如何在特定的間隔進行重複運行作業以及何時啟動作業。 2、驗證cron表達式的正確性非常重要,可以確保…

    編程 2025-02-25
  • Java表達式的全面解析

    一、操作符和操作數 在Java中,表達式是由操作符和操作數組成的。操作符分為算術操作符、關係操作符、邏輯操作符和位操作符。操作數可以是常量、變數、方法調用或者其他表達式。 //算術…

    編程 2025-02-17
  • 深入了解execution表達式

    隨著Spring框架的不斷發展,execution表達式作為Spring AOP切點表達式的核心語法之一,也逐漸成為了Java開發人員必備的技能之一。execution表達式主要作…

    編程 2025-02-17
  • 布爾表達式

    一、布爾表達式概述 布爾表達式是程序中經常用到的一種表達式,它主要用於邏輯判斷及條件控制。布爾表達式只有兩種取值,分別為真(true)和假(false),通常用1和0表示。在編程中…

    編程 2025-02-05
  • CORE表達式詳解

    一、CORE表達式是什麼 CORE被稱為「公共對象運行時環境」,它是一個用於構建分散式應用程序的開源平台。CORE表達式是CORE的核心部分,它定義了對象的行為和交互方式,並通過通…

    編程 2025-01-27
  • 深入了解cron表達式每分鐘執行一次

    一、cron表達式介紹 cron是一種用於設置周期性執行任務的工具,它可以在指定時間自動運行任務。通常被用於 Linux 和 Unix 系統中,由於其實用性和靈活性而備受歡迎。cr…

    編程 2025-01-20

發表回復

登錄後才能評論