优化嵌套承诺
Optimising a nested promise
如何优化以下内容(即避免嵌套承诺)?它工作,但似乎我要继续嵌套承诺
代码首先验证并返回一个服务,然后将该服务提供给一个函数,该函数异步调用api以获取项目,然后我将对项目做一些事情,可能调用另一个包含异步调用的函数:
new Promise(function(resolve, reject) {
auth.authenticate(resolve);
}).then(function(service) {
console.log('service', service);
new Promise(function(resolve, reject) {
lineItems.getLineItems(service, resolve, reject);
}).then(function(items) {
console.log('returned line items');
console.log(items);
}).catch(function(err){
console.log('error!', err);
});
});
返回then
的新承诺:
new Promise(function(resolve, reject) {
auth.authenticate(resolve);
}).then(function(service) {
console.log('service', service);
return new Promise(function(resolve, reject) {
lineItems.getLineItems(service, resolve, reject);
});
}).then(function(items) {
console.log('returned line items');
console.log(items);
}).catch(function(err){
console.log('error!', err);
});
同样,如果你可以调整lineItems.getLineItems
返回一个承诺,它看起来更简洁:
new Promise(function(resolve, reject) {
auth.authenticate(resolve);
}).then(function(service) {
console.log('service', service);
return lineItems.getLineItems(service);
}).then(function(items) {
console.log('returned line items');
console.log(items);
}).catch(function(err){
console.log('error!', err);
});
我主要在函数的定义方式上看到了几个问题。这实际上来自于代码中定义的异步函数的非标准签名。
如果auth.authenticate
和lineItems.getLineItems
是您编写的,请更新这些函数以返回正确的Promise。那么合成将是:
auth.authenticate()
.then((service) => lineItems.getLineItems(service))
.then((items) => console.info('Items:',items))
.catch((err) => console.error(err));
如果auth.authenticate
和/或lineItems.getLineItems
是外部的,并遵循标准的nodejs callbak/errback风格,你可以包装这些函数来返回一个承诺:
const authenticate = Promise.promisify(auth.authenticate, {context:auth});
const getLineItems = Promise.promisify(lineItems.getLineItems,{context:lineItems});
authenticate()
.then(getLineItems)
.then((items) => console.info('Items:',items))
.catch((err) => console.error(err));
相关文章:
- 嵌套承诺会产生类似的效果
- 如何将嵌套设置超时转换为承诺
- 干净的代码和嵌套的承诺
- 蓝鸟承诺 - 嵌套与拒绝模式
- 如何展平嵌套承诺依赖项
- 余烬嵌套的路线和承诺
- 嵌套承诺
- 测试嵌套AngularJS与Jasmine的承诺
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 嵌套承诺与q-io
- 如何将嵌套承诺与Q连锁?我可以'Don’我不能让它们按正确的顺序运行
- 在嵌套承诺链中重新引发异常
- 此代码中嵌套承诺的目的是什么
- 嵌套承诺执行不同步
- 嵌套的 AJAX 调用列表和 $.when.apply - 延迟承诺无法正常工作
- AngularJs $q.all 不会用混合的嵌套承诺来解决
- 使用模拟工厂在茉莉花中测试嵌套承诺
- angular.foreach 解析嵌套承诺
- 如何避免用$q嵌套承诺
- 使用请求-承诺的嵌套异步请求