你能避免和Promises一起嵌套吗
Can you avoid nesting altogether with Promises?
据我所知,Promises的主要卖点之一是能够编写平面代码(或者,比回调地狱更平坦)。
尽管在许多情况下,我们似乎需要嵌套承诺,以便使用闭包。例如(来自q的文档,尽管我使用Bluebird):
function authenticate() {
return getUsername()
.then(function (username) {
return getUser(username);
})
// chained because we will not need the user name in the next event
.then(function (user) {
return getPassword()
// nested because we need both user and password next
.then(function (password) {
if (user.passwordHash !== hash(password)) {
throw new Error("Can't authenticate");
}
});
});
}
有没有一种更清洁的方法可以做到这一点,而不需要嵌套?
编辑:我已经使用.all
清理了这个特定的例子,但还有一些更复杂的情况我认为无法做到:
function authenticate() {
return Promise.all([
getUsername().then(getUser),
getPassword()
]).spread(function (user, password) {
if (user.passwordHash !== hash(password)) {
throw new Error('Can''t authenticate');
}
});
}
是的,您总是可以使用Promise.all
(Bluebird中Promise.join
的简写)来压平promise链,方法是使用promise作为代理。毕竟,promise是抽象值,你可以随时打开promise,并让其他变量依赖它
它是否更可读是另一个争论:
foo().then(function(a){
return bar(a).then(function(b){
return g(a,b); // "needed" to nest because I wanted `a`
});
});
可以写成:
var a = foo();
var b = a.then(bar);
Promise.join(a, b, function(a,b){
return g(a, b); // alternatively, res could have been `Promise.join(a,b, g)`
});
所以一般来说,你可以总是避免嵌套,但很多时候你可能不想这样做。
在您的情况下,这甚至可以是:
function authenticate() {
var userPass = Promise.all([ getUsername().then(getUser), getPassword()]);
var passHash = userPass.get(0).get("passwordHash");
var newHash = userPass.get(1).then(hash);
var equal = Promise.join(userHash, newHash, function(a, b){ return a !==b });
return equal.then(function(val){ if(!val) throw new Error("..."); });
}
压扁?当然较好的这是另一个问题。如果你有一个嵌套的for
循环,你可能想让它保持一个嵌套for
循环和嵌套,而不是绕过这个选项并使用单个循环。
相关文章:
- 用嵌套函数和默认函数定义函数
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 可以简化嵌套的延迟Q Promises解析吗
- 用于搜索的聚合物嵌套绑定
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- d3中堆栈函数和嵌套函数之间的差异
- 如何打印嵌套对象的所有值
- JavaScript 中的嵌套函数和 “this” 关键字
- 我需要在单击时运行两个函数.即使嵌套在一起,我也无法让它们都工作
- Jquery 如何指定哪个可丢弃对象应与嵌套的可放置元素一起使用
- 嵌套在 Node 中的循环.js与 Mocha 测试框架一起
- 如何将嵌套模型与骨干表单列表一起使用?我想用自定义模板制作一个嵌套模型
- 你能避免和Promises一起嵌套吗
- 如何将嵌套迭代器与 Mustache.js 或 Handlebars.js一起使用
- 如何以嵌套方式将预定义指令(ng-click)与自定义指令一起使用
- jQuery XML解析不能与嵌套标签一起工作
- SuperDevMode不能与嵌套脚本一起工作
- promise如何与嵌套函数调用一起工作
- 将jquery中的$(this)选择器与另一个嵌套选择器一起使用
- 指令隔离范围不能与嵌套视图一起正常工作?(AngularJS/UI路由器)