reduce+Promise顺序执行代码-创新互联
本文地址: http://www.cnblogs.com/jasonxuli/p/4398742.html
分享标题:reduce+Promise顺序执行代码-创新互联
网站链接:http://azwzsj.com/article/ceoecs.html
下午的太阳晒得昏昏沉沉,和上周五一样迷糊,看一段代码半天没看明白,刚才不知不觉眯了几分钟,醒来后再看就醒悟了。
创新互联长期为上千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为巍山企业提供专业的成都做网站、成都网站设计、成都外贸网站建设,巍山网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。这段代码先加载story.json文件,然后依次加载story.chapterUrls数组中的url。看半天一直没搞明白为啥是顺序的,原因是每个reduce执行的function本身就构造了first - next的顺序结构,而Promise的then又保证了代码的顺序执行,即reduce把多个then串起来生成了一长串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()是怎么做到把异步回调式的函数变成Promise式的函数。看了半天,发现它把目标函数的最后一位参数当做callback,并且把这个callback函数的第一位参数当做err。原来是有前置条件的,那么好像没我想的那么强大嘛。迷糊的时候又去看了下bluebird的md文档,原来人家早就说了:
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/分享标题:reduce+Promise顺序执行代码-创新互联
网站链接:http://azwzsj.com/article/ceoecs.html