須要在 angular 中掌握異步的知識,咱們須要掌握這幾個重要的知識點,http, promisepromise
假設有一個傢俱廠,而它有一個VIP客戶張先生。 有一天張先生須要一個豪華衣櫃,因而,他打電話給傢俱廠說我須要一個衣櫃,回頭作好了給我送來,這個操做就叫**$q.defer**,也就是延期,由於這個衣櫃不是如今要的,因此張先生這是在發起一個可延期的請求。異步
同時,傢俱廠給他留下了一個回執號,並對他說:咱們作好了會給您送過去,放心吧。這叫作==promise==,也就是承諾。 這樣,這個==defer==算是正式建立了,因而他把這件事記錄在本身的日記上,而且同時記錄了回執號,這叫作==deferred==,也就是已延期事件。post
如今,張先生就不用再去想着這件事了,該作什麼作什麼,這就是「異步」的含義。 假設傢俱廠在一週後作完了這個衣櫃,並如約送到了張先生家(包郵哦,親),這就叫作==deferred.resolve(衣櫃)==,也就是「已解決」。而這時候張先生只要簽收一下這個(衣櫃)參數就好了,固然,這個「郵包」中也不必定只有衣櫃,還能夠包含別的東西,好比廠家宣傳資料、產品名錄等。整個過程當中輕鬆愉快,誰也沒等誰,沒有浪費任什麼時候間。事件
假設傢俱廠在評估後發現這個規格的衣櫃咱們作不了,那麼它就須要==deferred.reject(理由)==,也就是「拒絕」。拒絕沒有時間限制,能夠發生在給出承諾以後的任什麼時候候,甚至可能發生在快作完的時候。並且拒絕時候的參數也不只僅限於理由,還能夠包含一個道歉信,違約金之類的,總之,你想給他什麼就給他什麼,若是你以爲不會惹惱客戶,那麼不給也不要緊。get
假設傢俱廠發現,本身正好有一個符合張先生要求的存貨,它就能夠用==$q.when(現有衣櫃)==來把這個承諾給張先生,這件事就當即被解決了,皆大歡喜,張先生可不在意你是從頭作的仍是現有的成品,只會驚歎於大家的效率之高。 假設這個傢俱廠對客戶格外的細心,它還可能經過deferred.notify(進展狀況)給張先生髮送進展狀況的「通知」。 這樣,整個異步流程就圓滿完成,不管成功或者失敗,張先生都沒有往裏面投入任何額外的時間成本。產品
好,咱們再擴展一下這個故事: 張先生此次須要作一個桌子,三把椅子,一張席夢思,可是他不但願今天收到個桌子,明天收到個椅子,後天又得簽收一次席夢思,而是但願傢俱廠作好了以後一次性送過來,可是他下單的時候又是分別下單的,那麼他就能夠從新跟傢俱廠要一個包含上述三個承諾的新承諾,這就是$q.all(桌子承諾,椅子承諾,席夢思承諾), 這樣,他就不用再關注之前的三個承諾了,直接等待這個新的承諾完成,到時候只要一次性簽收了前面的這些承諾就好了。io