then()和Promise的使用

then()方法是異步執(zhí)行

就是當(dāng).then()前的方法執(zhí)行完后再執(zhí)行then()內(nèi)部的程序
這樣就避免了罗岖,數(shù)據(jù)沒獲取到等的問題


then 方法(承諾)
允許你指定實現(xiàn)承諾時要完成的工作抱完。

語法

promise.then(onCompleted, onRejected);

參數(shù)

  • promise
    必需练对。
    Promise 對象。
  • onCompleted
    必需。
    承諾成功完成時要運行的履行處理程序函數(shù)。
  • onRejected
    可選。
    承諾被拒絕時要運行的錯誤處理程序函數(shù)状飞。

備注
承諾必須完成(返回一個值)或者必須被拒絕(返回一個原因)。承諾完成或被拒絕時(無論哪一個先發(fā)生)书斜,Promise 對象的 then 方法都會運行诬辈。
如果承諾成功完成,則將運行 then 方法的履行處理程序函數(shù)荐吉。如果承諾被拒絕焙糟,則將運行 then 方法(或 catch 方法)的錯誤處理程序函數(shù)。

下面的示例演示如何調(diào)用返回承諾的函數(shù) (timeout)样屠。
達(dá)到 5000 ms 的超時時間后穿撮,將運行 then 方法的履行處理程序缺脉。

function timeout(duration) { 
  return new Promise(function(resolve, reject) { 
    setTimeout(resolve, duration); 
  });
}

// Note: This code uses arrow function syntax
var m = timeout(5000).then(() => { 
  console.log("done!");
})

// Output (after 5 seconds):
// done!

如果還有疑問再看一下Promise

“Promises” 代表著在javascript程序里下一個偉大的范式,但是理解他們?yōu)槭裁慈绱藗ゴ蟛皇羌唵蔚氖略么K暮诵木褪且粋€promise代表一個任務(wù)結(jié)果攻礼,這個任務(wù)有可能完成有可能沒完成。Promise模式唯一需要的一個接口是調(diào)用then方法栗柒,它可以用來注冊當(dāng)promise完成或者失敗時調(diào)用的回調(diào)函數(shù)礁扮,這在CommonJS Promises/A proposal.大體講到了。比如瞬沦,我想保存一個Prase.Object對象深员,這是個異步操作,在舊的回調(diào)范式中蛙埂,你的代碼可能這樣寫:

object.save({ key: value }, {
  success:function(object) {
    // the object was saved.
  },
  error:function(object, error) {
    // saving the object failed.
  }
});

在新的Promise范式中,同樣的代碼你可以這樣寫:

object.save({ key: value }).then(
  function(object) {
   // the object was saved.
  },
 function(error) {
   // saving the object failed.
 });

沒有多大的區(qū)別遮糖?那么有啥大不了的地方呢绣的?好吧,promises的真正強大之處在于多重的鏈接欲账,當(dāng)調(diào)用promise.then(func)時返回一個新的promise屡江,它不會執(zhí)行直到上一個完成。但是這里有一種特殊的情況赛不,如果我的回調(diào)通過then返回一個新的promise惩嘉,那么通過then返回的promise將不會執(zhí)行,直到回調(diào)執(zhí)行完成踢故。詳細(xì)細(xì)節(jié)請參考 Promises/A+文黎,這是個復(fù)雜的規(guī)則,通過例子我們能更清楚的認(rèn)識下.

假設(shè)你寫了段登陸的代碼殿较,查找對象然后更新它耸峭。在舊的回調(diào)范式中,你可以使用金字塔式的代碼完成:

Parse.User.logIn("user","pass", {
 success:function(user) {
  query.find({
   success:function(results) {
    results[0].save({ key: value }, {
     success:function(result) {
      // the object was saved.
     }
    });
   }
  });
 }
});

這看起來已經(jīng)很可笑淋纲,更可笑的是甚至沒有任何錯誤處理劳闹。但是promise鏈?zhǔn)降慕Y(jié)構(gòu),使代碼看起來更舒服了:

Parse.User.logIn("user","pass").then(function(user) {
 returnquery.find();
}).then(function(results) {
 returnresults[0].save({ key: value });
}).then(function(result) {
 // the object was saved.
});

哇!好多啦洽瞬!

錯誤處理
上面的代碼簡單期間沒有添加錯誤處理本涕,但是添加了后你會發(fā)現(xiàn)在舊的回調(diào)代碼中一團糟:

Parse.User.logIn("user","pass", {
 success:function(user) {
  query.find({
   success:function(results) {
    results[0].save({ key: value }, {
     success:function(result) {
      // the object was saved.
     },
     error:function(result, error) {
      // An error occurred.
     }
    });
   },
   error:function(error) {
    // An error occurred.
   }
  });
 },
 error:function(user, error) {
  // An error occurred.
 }
});

由于promises知道處理是否完成,它可以傳遞錯誤伙窃,不執(zhí)行任何回調(diào)直到遇到錯誤菩颖。比如,上面的代碼可以簡寫為:

Parse.User.logIn("user","pass").then(function(user) {
 returnquery.find();
}).then(function(results) {
 returnresults[0].save({ key: value });
}).then(function(result) {
 // the object was saved.
},function(error) {
 // there was some error.
});

通常对供,開發(fā)者認(rèn)為一個異步的promise失敗等同于拋出一個異常位他。事實上氛濒,如果一個回調(diào)拋出一個錯誤,promise將返回失敗信息鹅髓。把錯誤傳遞到下一個可用的錯誤處理器等同于拋出一次異常直到捕獲處理舞竿。


romises/A規(guī)范
<small>注:為了便于理解,描述可能和Promises/A規(guī)范有所出入窿冯;
?CommonJS之Promises/A規(guī)范骗奖,通過規(guī)范API接口來簡化異步編程,使我們的異步邏輯代碼更易理解醒串。遵循Promises/A規(guī)范的實現(xiàn)我們稱之為Promise對象执桌,Promise對象有且僅有三種狀態(tài):unfulfilled(未完成)、fulfilled(已完成)芜赌、failed(失敗/拒絕)仰挣;初始創(chuàng)建的時候是unfulfilled(未完成)狀態(tài),狀態(tài)只可以從unfulfilled(未完成)變成fulfilled(已完成)缠沈,或者unfulfilled(未完成)變成failed(失敗/拒絕)膘壶。狀態(tài)一旦變成fulfilled(已完成)或者failed(失敗/拒絕),狀態(tài)就不能再變了洲愤。
Promises/A規(guī)范提供了一個在程序中描述延時(或?qū)恚└拍畹慕鉀Q方案颓芭。主要的思想不是執(zhí)行一個方法然后阻塞應(yīng)用程序等待結(jié)果返回后再回調(diào)其他方法,而是返回一個Promise對象來滿足未來監(jiān)聽柬赐。fulfilled狀態(tài)和failed狀態(tài)都可以被監(jiān)聽亡问。Promise通過實現(xiàn)一個then接口來返回Promise對象來注冊回調(diào):
復(fù)制代碼代碼如下:

then(fulfilledHandler, errorHandler, progressHandler);

?then接口用于監(jiān)聽一個Promise的不同狀態(tài)肛宋。fulfilledHandler用于監(jiān)聽fulfilled(已完成)狀態(tài)州藕,errorHandler用于監(jiān)聽failed(失敗/拒絕)狀態(tài),progressHandler用于監(jiān)聽unfulfilled(未完成)狀態(tài)酝陈。Promise不強制實現(xiàn)unfulfilled(未完成)的事件監(jiān)聽(例如我們知道舊版本的jQuery(1.5慎框,1.6)的Deferred就是一個Promise的實現(xiàn),但沒有實現(xiàn)對unfulfilled(未完成)狀態(tài)的監(jiān)聽來回調(diào)progressHandler)后添。
一般認(rèn)為笨枯,then接口返回的是一個新的Promise對象,而不是原來的Promise對象遇西,這個新的新的Promise對象可以理解為是原來Promise對象的一個視圖馅精,它只包含原有Promise對象的一組方法,這些方法只能觀察原有Promise對象的狀態(tài)粱檀,而無法更改deferred對象的內(nèi)在狀態(tài)洲敢。這樣可以避免多個調(diào)用者之間的沖突,多個調(diào)用者可以通過改變新的Promise對象狀態(tài)而不影響別的調(diào)用者茄蚯。
另外压彭,Promise提供了resolve(實現(xiàn)狀態(tài)由未完成到已完成)和reject(實現(xiàn)狀態(tài)由未完成到拒絕或失斈烙拧)兩個接口實現(xiàn)狀態(tài)的轉(zhuǎn)變。</small>
發(fā)一張圖片幫助理解一下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壮不,一起剝皮案震驚了整個濱河市汗盘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌询一,老刑警劉巖隐孽,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異健蕊,居然都是意外死亡菱阵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門缩功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晴及,“玉大人,你說我怎么就攤上這事嫡锌】苟恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵世舰,是天一觀的道長。 經(jīng)常有香客問我槽卫,道長跟压,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任歼培,我火速辦了婚禮震蒋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躲庄。我一直安慰自己查剖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布噪窘。 她就那樣靜靜地躺著笋庄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倔监。 梳的紋絲不亂的頭發(fā)上直砂,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音浩习,去河邊找鬼静暂。 笑死,一個胖子當(dāng)著我的面吹牛谱秽,可吹牛的內(nèi)容都是我干的洽蛀。 我是一名探鬼主播摹迷,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼郊供!你這毒婦竟也來了峡碉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤颂碘,失蹤者是張志新(化名)和其女友劉穎异赫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體头岔,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡塔拳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峡竣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靠抑。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖适掰,靈堂內(nèi)的尸體忽然破棺而出颂碧,到底是詐尸還是另有隱情,我是刑警寧澤类浪,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布载城,位于F島的核電站,受9級特大地震影響费就,放射性物質(zhì)發(fā)生泄漏诉瓦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一力细、第九天 我趴在偏房一處隱蔽的房頂上張望睬澡。 院中可真熱鬧,春花似錦眠蚂、人聲如沸煞聪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昔脯。三九已至,卻和暖如春笛臣,著一層夾襖步出監(jiān)牢的瞬間栅干,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工捐祠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碱鳞,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓踱蛀,卻偏偏與公主長得像窿给,于是被迫代替她去往敵國和親贵白。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 00、前言Promise 是異步編程的一種解決方案角撞,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大呛伴。它由社區(qū)...
    夜幕小草閱讀 2,127評論 0 12
  • Promiese 簡單說就是一個容器,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作)的結(jié)果谒所,語法上說热康,Pr...
    雨飛飛雨閱讀 3,348評論 0 19
  • Promise的含義: ??Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和...
    呼呼哥閱讀 2,164評論 0 16
  • Promise 的含義 一句話概括一下promise的作用:可以將異步操作以同步操作的流程表達(dá)出來劣领,避免了層層嵌套...
    雪萌萌萌閱讀 5,442評論 0 7
  • 一一縣婦計中心借扶貧健康體檢開展免費疼痛治療 5月8日尖淘,火燒店鎮(zhèn)中心衛(wèi)生院健康扶貧體檢正如火如荼進行奕锌,堰坎村...
    0f1527bf5246閱讀 684評論 0 0