我想跳过所有的。然后在特定的.then之后。但是这个特殊的.then需要将数据返回给调用者。
function test() {
return User.findOne({ where: potentialUser })
.then(function(user) { // level-1
if(!user) {
return { // data-1
status: 404,
json: { message: 'Not a valid user.' }
};
} else {
return anyValidPromise;
}
})
.then(function(isMatch) { // level-2
})
.then(function(val) { // level-3
})
.then(function(val) {
})
.then(function(val) {
})
.catch(function(error) {
console.log(error);
return {
status: 500,
json: { message: 'There was an error!' }
};
});
}
现在根据上面的例子,level-1必须将data-1返回给test的调用者。而且所有来自第二级的.then都不会被执行。
有可能实现这个目标吗?
如果所有.then都被执行,那么调用者将获得在.then的最后一级返回的数据。
答案 0 :(得分:1)
Promise的一个优点是“毁灭金字塔”的“扁平化”
但有时,所需的逻辑需要一定程度的“嵌套”
这是一个这样的案例
function test() {
return User.findOne({ where: potentialUser })
.then(function(user) { // level-1
if(!user) {
return { // data-1
status: 404,
json: { message: 'Not a valid user.' }
};
} else {
return anyValidPromise
.then(function(isMatch) { // level-2
})
.then(function(val) { // level-3
})
.then(function(val) {
})
.then(function(val) {
})
}
)
.catch(function(error) {
console.log(error);
return {
status: 500,
json: { message: 'There was an error!' }
};
});
}
重构,你可以做类似的事情(我不喜欢这样)
function test() {
let level4 = bar => {
if(bar) {
return {};
} else {
return {};
}
}
let level3 = foo => {
if(foo) {
return {};
} else {
return level4(bar);
}
}
let level2 = isMatch => {
if(isMatch) {
return {};
} else {
return level3(foo);
}
}
let level1 = user => {
if(!user) {
return { // data-1
status: 404,
json: { message: 'Not a valid user.' }
};
} else {
return anyValidPromise.then(level2)
}
};
return User.findOne({ where: potentialUser })
.then(level1)
.catch(function(error) {
console.log(error);
return {
status: 500,
json: { message: 'There was an error!' }
};
});
}
不确定这是否有用,但原始代码是“稀疏的”:p
另一种可能性是滥用承诺拒绝链以获取您自己的邪恶手段
function test() {
return User.findOne({ where: potentialUser })
.then(function(user) { // level-1
if(!user) {
throw { // data-1
status: 404,
json: { message: 'Not a valid user.' },
skip: true
};
} else {
return anyValidPromise;
}
})
.then(function(isMatch) { // level-2
if (youWantToSkipFromHere) {
throw {
status: ???
json: ???
skip: true
};
}
})
// etc etc
.then(function(val) { // level-3
if (youWantToSkipFromHere) {
throw {
status: ???
json: ???
skip: true
};
}
})
.catch(function(error) {
if (error.skip) {
return error;
}
console.log(error);
return {
status: 500,
json: { message: 'There was an error!' }
};
});
}