下午的太陽(yáng)曬得昏昏沉沉,和上周五一樣迷糊,看一段代碼半天沒(méi)看明白,剛才不知不覺(jué)瞇了幾分鐘,醒來(lái)后再看就醒悟了。
創(chuàng)新互聯(lián)長(zhǎng)期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為巍山企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè),巍山網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。這段代碼先加載story.json文件,然后依次加載story.chapterUrls數(shù)組中的url??窗胩煲恢睕](méi)搞明白為啥是順序的,原因是每個(gè)reduce執(zhí)行的function本身就構(gòu)造了first - next的順序結(jié)構(gòu),而Promise的then又保證了代碼的順序執(zhí)行,即reduce把多個(gè)then串起來(lái)生成了一長(zhǎng)串then。
getJson('story.json').then(function(story) {
addHtmlToPage(story.heading);
return story.chapterUrls.reduce(function(chain, chapterUrl) {
console.log('reduce ', chain, chapterUrl);
// Once the last chapter's promise is done… return chain.then(function() {
// …fetch the next chapter return getJson(chapterUrl);
}).then(function(chapter) {
// and add it to the page addHtmlToPage(chapter.html);
});
}, Promise.resolve());
}).then(function() {
// And we're all done! addTextToPage("All done");
}).catch(function(err) {
// Catch any error that happened along the way addTextToPage("Argh, broken: " + err.message);
}).then(function() {
// Always hide the spinner document.querySelector('.spinner').style.display = 'none';
});
上周五看bluebird的代碼,想找出Promise.promisify()是怎么做到把異步回調(diào)式的函數(shù)變成Promise式的函數(shù)。看了半天,發(fā)現(xiàn)它把目標(biāo)函數(shù)的最后一位參數(shù)當(dāng)做callback,并且把這個(gè)callback函數(shù)的第一位參數(shù)當(dāng)做err。原來(lái)是有前置條件的,那么好像沒(méi)我想的那么強(qiáng)大嘛。迷糊的時(shí)候又去看了下bluebird的md文檔,原來(lái)人家早就說(shuō)了:
The node function should conform to node.js convention of accepting a callback as last argument and calling that callback with error as the first argument and success value on the second argument.
博客地址:http://www.cnblogs.com/jasonxuli/