国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

angular.js - angularjs $q的promise 怎么解決嵌套的ajax問題?

瀏覽:149日期:2024-10-01 11:41:10

問題描述

問題一:我需要用第一次發送ajax請求回的數據作為第二次ajax的參數,而第二次的ajax是在第一次ajax的回調函數里發送的。但是這里有問題!就是第二次ajax返回的數據不能賦值給全局對象的屬性,不知道是不是掉到坑里了。所以想用$q解決。問題二:那這個例子來說吧,// $q 是內置服務,所以可以直接使用 ngApp.factory(’UserInfo’, [’$http’, ’$q’, function ($http, $q) { return {

query : function() { var deferred = $q.defer(); // 聲明延后執行,表示要去監控后面的執行 $http({method: ’GET’, url: ’scripts/mine.json’}). success(function(data, status, headers, config) { deferred.resolve(data); // 聲明執行成功,即http請求數據成功,可以返回數據了 }). error(function(data, status, headers, config) { deferred.reject(data); // 聲明執行失敗,即服務器返回錯誤 }); return deferred.promise; // 返回承諾,這里并不是最終數據,而是訪問最終數據的API } // end query

}; }]); deferred.resolve 是為了延遲執行嗎?那如果能在回調函數里面寫邏輯為什么還要多此一舉的延遲執行呢?問題三:為什么說deferred.promise返回的承諾是最終數據api?這個promise的作用是什么?問題四:promise.then執行邏輯是什么?

問題解答

回答1:

在回答你所有的問題之前,我先對你的示例代碼做些簡單說明!!

你的示例代碼是一個典型的Promise的反面教材,其特征就是:無目的的創建deferred對象,徒增代碼復雜度。關于這點,可以看這里anti-pattern:

angular.js - angularjs $q的promise 怎么解決嵌套的ajax問題?

糾正問題之后,我們再來回頭談你的問題。

首先,當你意識到自己正在忍受callback hell的時候,恭喜你,在javascript這條路上,你算上道兒了。那么解決之道有哪些呢?我們最近常見的有:

Promise

generator配合co

async/await

關于這幾種方式的詳細介紹,我沒仔細翻別人的答案(或許有更好的),只能把自己之前寫的貼出來javascript里的異步

OK,介紹了解決callback hell的幾種常見方式,再回頭來說你的Promise問題

問題一:我需要用第一次發送ajax請求回的數據作為第二次ajax的參數,而第二次的ajax是在第一次ajax的回調函數里發送的。但是這里有問題!就是第二次ajax返回的數據不能賦值給全局對象的屬性,不知道是不是掉到坑里了。所以想用$q解決。

既然我們寄希望于Promise能夠解決回調地獄的問題,拿肯定不會再是使用回調的方式,你的疑惑是對的,可你的問題是沒有充分理解Promise是這么工作的。我先舉個例子:

var call1 = function(cb) { setTimeout(function() {cb(’call1’); }, 10);};var call2 = function(param1, cb) { setTimeout(function() {cb(param1 + ’ + call2’); }, 10);};call1(function(param1) { call2(param1, function(param2) {console.log(param2); //call1 + call2 });});

這是一個典型的回調依賴,call2依賴了call1的結果。如果用Promise改寫,應該是什么樣子呢?

var call1 = function() { return new Promise(function(resolve, reject) {setTimeout(function() { resolve(’call1’);}, 10); });};var call2 = function(param1) { return new Promise(function(resolve, reject) {setTimeout(function() { resolve(param1 + ’ + call2’);}, 10); });};call1() .then(function(param1) {return call2(param1); }) .then(function(param2) {console.log(param2); //call1 + call2 });

這里有幾個要注意的地方,1. 無需不必要的deferred對象,call1和call2本身返回Promise對象即可; 2. resolve幾乎扮演了之前cb的角色; 3. 當執行call1、call2時,不塞入回調,而是通過then拿到返回結果 4. 尤其return call2(param1);這個地方,真的不要再度嵌套(很多初入Promise的選手犯的錯),直接返回,下一個then里就能拿到結果

問題二:那這個例子來說吧

這就是最早說的問題,你過度反應了,明顯把簡單問題復雜化了,這么寫足矣:

ngApp.factory(’UserInfo’, [’$http’, ’$q’, function($http, $q) { return {query: function() { return $http({method: ’GET’, url: ’scripts/mine.json’});} };}]);

調用的地方,直接用then就好了:

UserInfo .query() .then(function(data){console.log(data);//這不就是結果嘍! });

第三、四個問題都是源于對Promise本身的實現沒概念,我之前寫過一個小教程,教大家自己手寫一個Promise的簡單實現,建議你跟著做做,先對Promise本身有個大概了解,一步步來手寫一個Promise

相關文章:
主站蜘蛛池模板: 日韩精品一区二区三区视频网 | 成人国产精品毛片 | 久草网在线 | 日本道在线播放 | 手机国产精品一区二区 | 日本aaaa级毛片在线看 | 欧美一级xxxx俄罗斯一级 | 国产在线爱做人成小视频 | 亚洲精品国产国语 | 偷拍自拍视频在线 | 久草在线免费播放 | 2022国产精品自拍 | 国产日韩欧美一区二区三区在线 | 国产一区二区三区在线免费观看 | 成人a毛片高清视频 | 99精品小视频 | 亚洲欧美日韩在线一区 | 亲子乱子伦xxxx | 久久综合丁香 | 中文字幕免费在线视频 | 亚洲香蕉久久一区二区三区四区 | 亚洲欧美综合国产精品一区 | 成人久久18免费游戏网站 | 国产a级高清版毛片 | 国产综合在线播放 | 成人久久久久 | 日韩在线中文 | 国产特黄一级毛片特黄 | 韩国日本三级在线观看 | 国产丝袜美腿高跟白浆 | 一个人看的免费高清视频日本 | 中文字幕综合在线 | 午夜成人影视 | 99久久综合 | 美女张开腿让男人桶爽免费网站 | 毛片搜索 | 99热r| 免费观看欧美精品成人毛片能看的 | 日本一视频一区视频二区 | 美女扒开腿让男人桶 | 日本丶国产丶欧美色综合 |