如何正确使用承诺
承诺是很棒的——它们使开发人员能够避免级联回调,并使代码更清晰.
However, 当你面对承诺时, 您应该尽可能避免为每个新请求创建新的承诺并自己管理它们.
让我们检查下面的代码:
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;
};
这里的问题是在每个函数中都创建了一个新的承诺, 但它是根据另一个次级承诺决议来解决的. 这种开发实践产生了不必要的代码,更难以阅读,效率更低. 我们应该将其重构为以下更易于承诺的版本:
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
从八岁开始写代码, 皮埃尔对技术的热爱使他获得了计算机科学硕士学位. 从纯工程到在Viadeo(100多个生产服务器)的高负载基础设施上构建CI和CD流程, 他以首席技术官的身份联合创立了一家初创公司. Pierre is a dedicated, enthusiastic leader, 他是一位富有创造力的解决方案制定者,也是一位拥有十多年经验的网络工程专家.
Show More