最近写的一段代码中因为多次需要依靠回调函数的返回值进行下一次回调,代码看起来十分的不好看,就想着去借助promise(Q)去优化一下代码,但是看了文档,还是一头雾水啊,例如下面的代码:
request.get(uri,function(err,res,body){
request.post({
uri: uri1,
form: body
},function(err,res,body1){
request.post({
uri: uri2,
form: body1
},function(err,res,body2){
//do something
})
})
})
如果用Q来写的话,该怎么写啊?
4 回复
看到Q就喷一次,比他好的太多了。推荐bluebird,API简洁,功能强大,尤其是它的promisifyAll方法 楼主的方法用bluebird的示例:
var Promise = require('bluebird')
var request = require('request')
Promise.promisifyAll(request)
//开始飞吧
request.getAsync(url).spread(function(res, body1){
return request.postAsync({uri: uri1, form: body1})
}).spread(function(res, body2){
return request.postAsync({uri: uri2, form: body2})
}).spread(function(res, body3){
//code with results
}).error(function(){
//handle error here
})
呃,怎么都不喜欢Q么?
最近刚刚看了下Q的文档,尝试一下,有错误请指正。
var Q = require('q');
var request = require('request');
var r = function () {
var wrap = function (result) {
// nfapply 包装的promise会将传递 [res, body]
return result[1];
};
// 这里返回一个包装好的promise
return Q.nfapply(request, arguments).then(wrap);
};
var promise =
r({uri: uri})
.then(function (body) {
return r({method: 'POST', uri: uri1, form: body});
})
.then(function (body1) {
return r({method: 'POST', uri: uri2, form: body1});
});
// 接下来
promise.then(function (body2) {
// do something
}, function (err) {
// handle err
});