Javascript 使用承诺避免嵌套回调
我还不熟悉使用Promise API,我正在努力避免深度嵌套的Promise链,据我所知,这是使用Promises的好处之一。以下面的伪代码为例,当后续承诺依赖于先前承诺的上下文时,如何避免嵌套承诺Javascript 使用承诺避免嵌套回调,javascript,promise,Javascript,Promise,我还不熟悉使用Promise API,我正在努力避免深度嵌套的Promise链,据我所知,这是使用Promises的好处之一。以下面的伪代码为例,当后续承诺依赖于先前承诺的上下文时,如何避免嵌套承诺 function loadDependency1() { // return a promsise to load the first dependency } function loadDependency2(dependency1) { // return a promise
function loadDependency1() {
// return a promsise to load the first dependency
}
function loadDependency2(dependency1) {
// return a promise to load the second dependency, which relies on the first dependency
}
function loadDependency3(dependency2) {
// return a promise to load the third dependency, which relies on the second dependency
}
function doWork(dependency1, dependency2, dependency3) {
// finally have all the things necessary to do work
}
// load all the dependencies and eventually doWork
loadDependency1().then(function(dependency1) {
return loadDependency2(dependency1).then(function(dependency2) {
return loadDependency3(dependency2).then(function(dependency3) {
doWork(dependency1, dependency2, dependency3);
});
});
});
当您从
返回承诺时,那么将在该承诺解决时解决:
因此,如果下一个只需要上一个:
loadDependency1().then(function(dependency1) {
return loadDependency2(dependency1);
}).then(function(dependency2) {
return loadDependency3(dependency2);
}).then(function(dependency3) {
doWork(dependency3);
});
如果需要第三个依赖项,则可以使用
如果依赖项互不依赖:
Promise.all([loadDependency1(),loadDependency2(),loadDependency3])
.spread(function(dep1,dep2,dep3){
doWork(dep1,dep2,dep3);
});
如果您希望在整个承诺链中保持“状态”,并使用现代化的承诺库,如您所能做到的:
loadDependency1().bind({}).then(function(dependency1) {
this.dep1 = dependency1;
return loadDependency2(dependency1);
}).then(function(dependency2) {
this.dep2 = dependency2;
return loadDependency3(dependency2);
}).then(function(dependency3) {
doWork(this.dep1, this.dep2, dependency3);
});
如果你不是(而且你真的应该是:),你可以。所有的你都可以绕过它:
loadDependency1().then(function(dependency1) {
return [loadDependency2(dependency1),dependency1];
}).spread(function(dependency2,dep1) {
return [loadDependency3(dependency2),dependency2,dep1];
}).spread(function(dependency3,dependency2,dependency1) {
doWork(dependency1, dependency2, dependency3);
});
请删除第一个示例中不必要的lambda:loadDependency1()。然后(loadDependency2)。然后(loadDependency3)。然后(doWork)代码>@Bergi这些lambda用于说明“线性”控制流的指导目的。我完全了解一阶函数:)不过评论不错。