javascript - 避免带有 promise 的嵌套回调

标签 javascript promise

我对使用 Promise API 还是个新手,我正在努力避免深度嵌套的 Promise 链,据我所知,这是使用 Promise 的好处之一。以下面的伪代码为例,当后续的 Promise 依赖于先前的 context 时,如何避免嵌套 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);
        });
    });
});

最佳答案

当您从 then 返回一个 promise 时,它​​将在该 promise 解析时解析:

所以,如果下一个只需要上一个:

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);
});

如果您想在整个 promise 链中保持“状态”并且正在使用现代 promise 库,例如 Bluebird你可以这样做:

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);
});

如果你不是(你真的应该是:))你可以.all绕过它:

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);
});

关于javascript - 避免带有 promise 的嵌套回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21242441/

相关文章:

javascript - 单击多种颜色更改单选按钮颜色

javascript - 在 ES 6 模块中重新导出默认值

typescript 不会因错误的 promise 返回类型而抛出错误

javascript - 在 Promise 中 resolved 或 rejected 之后你应该返回一些东西吗?

javascript - 这个 Promise 链保证按这个顺序执行吗?

javascript - 数据表:使用剥离的 HTML 进行列搜索

javascript - 如何使用 javascript 从 JavaScript 对象(包含对象数组)获取所有值

javascript - Try Catch 无法捕获 UnhandledPromiseRejectionWarning

javascript - 从 Promise 返回完整的数组

javascript - 如何让 Guard 自动编译我的 Coffeescript 文件?说是但不是