在上1篇《Javascript Promises模式――相当酷的Callback Hell终结者》我们介绍了Javascript的Promise模式,接着我们就把Javascript Promise用到我们的代码中。
JavaScript Promise库 Q
之前试着用过Q,但是没有成功。或说,在那时候不需要用上Q,所以没有深究。现在抱着学习的态度,重新试了1下,效果还不错。
A tool for making and composing asynchronous promises in JavaScript
Q是1个提供制作和创作异步Promise的JavaScript工具。Q 提供了1些辅助函数,可以将Node和其他环境适配为promise可用的。
转载保存: 《NodeJS Multiple Callback解决之使用Q Promises》
JavaScript Promise库 Q示例
官网给了1个简单的转换的说明
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});
将他转换为
Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
// Do something with value4
})
.catch(function (error) {
// Handle any error from all above steps
})
.done();
但是,我们没有看懂,我们到底做了些甚么。。
JavaScript Promise 库 Q实战
原生的代码是这模样的,用的是async库
async.parallel([
function () {
'use strict';
pr.get(domain, next);
},
function () {
'use strict';
gs.get(name, next);
},
function () {
'use strict';
csdn.get(name, next);
},
function () {
'use strict';
zhihu.get(name, next);
},
function () {
'use strict';
alexa.get(domain, next);
}
]);
但是总感觉写得有点乱,不过最少离开了所谓的回调大坑。
进程大致上就是当我们需要不断往我们的result里面添加东西。
因而将代码改成Promise的情势,接着就变成这样了
github.promise_get(response, name)
.then(function (result) {
return pr.promise_get(result, domain);
})
.then(function (result) {
return csdn.promise_get(result, name);
})
.then(function (result) {
return zhihu.promise_get(result, name);
})
.then(function (result) {
return alexa.promise_get(result, domain);
})
.then(function (result) {
callback(result);
});
但是这样看上去写得有点不好,由于我们将进程固化在代码中,因而试着,用别的方法对其重构。
重构的第1步后就变成这模样
var info = Information.prototype;
info.pageRank_get = function(result){
'use strict';
return pageRank.promise_get(result, Information.prototype.domain);
};
info.alexa_get = function(result){
'use strict';
return alexa.promise_get(result, Information.prototype.domain);
};
info.csdn_get= function (result) {
'use strict';
return csdn.promise_get(result, info.name);
};
info.github_get= function (result) {
'use strict';
return github.promise_get(result, info.name);
};
info.zhihu_get = function (result) {
'use strict';
return zhihu.promise_get(result, info.name);
};
info.initVal = function (result) {
'use strict';
result = [];
return result;
};
Information.prototype.get = function (callback) {
'use strict';
Q.fcall(info.initVal)
.then(info.github_get)
.then(info.csdn_get)
.then(info.zhihu_get())
.then(info.pageRank_get)
.then(info.alexa_get)
.then(function (result) {
callback(result);
});
};
先提出每个方法,然后我们就能够选择我们需要用到的库。看上去比上面整洁多了,但是我们还需要下1步,以便继续。