如何正确使用承诺
Promises are wonderful - they enable developers to avoid cascading callbacks and make the code way clearer.
However, 当你面对承诺时, you should avoid as much as possible creating new promises for each new request and managing them yourself.
让我们检查下面的代码:
var makeRequest = function(options){
var deferred = Q.defer();
request.调用(options, function(err, result){
if(err){
return deferred.reject(err);
}
deferred.resolve(result);
});
return deferred.promise;
};
var getRequest =函数(url){
var deferred = Q.defer();
var options = {
method: "GET",
url: url
};
makeRequest(options)
.then(function(result){
deferred.resolve(result);
})
.catch(function(error){
deferred.reject(error);
})
;
return deferred.promise;
};
var getMyAccount = function(accountId){
var deferred = Q.defer();
getRequest(' /账户/ ' + accountId)
.then(function(result){
deferred.resolve(result);
})
.catch(function(error){
deferred.reject(error);
})
;
return deferred.promise;
};
这里的问题是在每个函数中都创建了一个新的承诺, 但它是根据另一个次级承诺决议来解决的. This development practice makes unnecessary code, more difficult to read and less efficient. We should refactor it into the following, more promise-friendly, version:
var makeRequest = function(options){
var deferred = Q.defer();
request.调用(options, function(err, result){
if(err){
return deferred.reject(err);
}
deferred.resolve(result);
});
return deferred.promise;
};
var getRequest =函数(url){
var options = {
method: "GET",
url: url
};
返回makeRequest(选项);
};
var getMyAccount = function(accountId){
返回getRequest(' /账户/ ' + accountId);
};
第二个版本避免在每个级别上创建新的承诺, thus reducing the overhead, 产生错误或处理错误的可能性, and is much more readable. And it works the same.
Contributors
Pierre Killy
Freelance Node.js Developer
从八岁开始写代码, Pierre's love of technology has led him to earn a master's degree in computer science. From pure engineering to building processes for CI and CD on heavy-loaded infrastructure at Viadeo (100+ production servers), 他以首席技术官的身份联合创立了一家初创公司. Pierre is a dedicated, enthusiastic leader, a creative solution-maker and a web engineering expert with more than a decade of experience.
Show More