所有對外調(diào)用的異步節(jié)接口坏瞄,都可以使用Promise扬跋,像文件讀寫,網(wǎng)絡(luò)請求拓春,數(shù)據(jù)庫操作等释簿,都可以使用Promise。
例子:爬去 cnnode 精華區(qū) 第一個(gè)帖子的個(gè)人信息
我們暫時(shí)不用axios硼莽,就用原生的request試一試
var request = require('request');
function readTopics() {
request('https://cnodejs.org/api/v1/topics?page=1&tab=good&limit=1&mdrender=false'
,function (error, response, body) {
if (error) {
return ;
}
var list = JSON.parse(body).data;
var name = list[0].author.loginname;
readUserInfo(name);
});
}
function readUserInfo(name) {
request('https://cnodejs.org/api/v1/user/' + name,function(error, response, body) {
var info = JSON.parse(body).data;
console.log(info);
})
}
readTopics();
有時(shí)候我們需要不斷的在回調(diào)中做處理庶溶,不斷的嵌套,而且中間也會遇到一些問題懂鸵,比如request的參數(shù)怎么用渐尿,你可能需要看下文檔,而不是像平常那樣用兩個(gè)參數(shù)就可以了矾瑰。它的內(nèi)容放在body里,而且是個(gè)字符串隘擎,而你有需要把字符串轉(zhuǎn)換為object殴穴。這些點(diǎn)其實(shí)不是需要我們關(guān)注的點(diǎn),如果把注意力都focus在這種事情上货葬,是有些影響我們的開發(fā)效率的采幌,而且照顧的點(diǎn)越多,就越會有出錯(cuò)的可能震桶,使后續(xù)的維護(hù)變得麻煩休傍。
而使用Promise就可以避免陷入回調(diào)的深淵,代碼寫的行云流水蹲姐,易懂易維護(hù)磨取。比如axios人柿,這個(gè)網(wǎng)絡(luò)請求就實(shí)現(xiàn)了Promise,現(xiàn)在很多第三方庫都實(shí)現(xiàn)了Promise忙厌。
我們使用Promise的方式來實(shí)現(xiàn)一下上述的例子
var axios = require('axios');
function readFirstItem() {
return axios.get('https://cnodejs.org/api/v1/topics?page=1&tab=good&limit=1&mdrender=false')
.then(readData)
.then(result=>{
return result.data[0].author.loginname;
})
// .then(readUserInfo)
// .catch(console.log);
}
function readUserInfo(name) {
return axios.get('https://cnodejs.org/api/v1/user/' + name)
.then(readData)
}
function readData(response) {
return response.data
}
readFirstItem().then(readUserInfo).then(console.log)
// 傳來的參數(shù)凫岖,可以選擇接也可以選擇不接,比如res.end()
// 如果是一個(gè)普通的異步函數(shù)逢净,那么把它轉(zhuǎn)換成Promise就可以用了哥放。
像這種鏈?zhǔn)降膶懛ǎ遣皇且谎劬湍芸闯鰜砻恳徊阶隽耸裁吹粒琣xios把網(wǎng)絡(luò)請求的結(jié)果的都放在了response.data里面了甥雕。
then傳入一個(gè)只有一個(gè)參數(shù)的回調(diào)函數(shù),我們可以直接把函數(shù)名傳入就可以執(zhí)行了胀茵。每個(gè)Promise對象都有then和catch使他們可以鏈?zhǔn)秸{(diào)用社露。返回一個(gè)Promise對象,不寫后面的catch使這個(gè)函數(shù)變得非常純宰掉,而catch讓調(diào)用者去調(diào)用catch處理錯(cuò)誤即可呵哨。整個(gè)流程非常清楚,
此外轨奄,Ramada是函數(shù)式編程的靈魂庫孟害,它實(shí)現(xiàn)了函數(shù)的curry化,讓函數(shù)編程的更加靈活挪拟。
Promise和Ramada帶來的生產(chǎn)效率是巨大的挨务。