有条件的回调执行:解决它的优雅方法是什么?

时间:2016-11-14 05:55:18

标签: javascript callback promise

我用不同的MongoDB查询创建了一个几乎不可读的代码。您很有可能直到最后才能成功。

Collection1.find({}, (err, doc) => {
    if (err)
        throw err;
    else if (doc) {
        Collection2.find({}, (err, doc) => {
            if (err)
                throw err;
            else if (doc) {
                let cursor = Collection3.find({})
                cursor.exec((err, doc) => {
                    if (err)
                        throw err;
                    else if (doc) {
                        Collection4.find();
                    }
                });
            } else {
                var y = new Collection2({
                    x: "S",
                    y: "D"
                })
                y.save((err, doc) => {
                    if (err)
                        throw err;
                    else if (doc) {
                        Collection3.find({});
                        let cursor = Collection3.find({})
                        cursor.exec((err, doc) => {
                            if (err)
                                throw err;
                            else if (doc) {
                                Collection4.find();
                            }
                        })
                    }
                })
            }
        })
    } else {
        taskComplete();
    }
})

现在回调地狱问题的一个解决方案是我将这些匿名函数打破为命名函数。这可能会解决一些问题,但我认为我们可以做得更好。
我还想过 async.series,async.waterfall ...不知怎的,我觉得他们不适合这个账单,因为我不想在这之后完成这个任务。它更像是否比这两者都不支持的那样。我无法根据条件选择运行哪个任务。 这让我有了承诺和生成器。 那些,这些数据库调用本身就是承诺。但如何将其与if和else整合是我没有经验的东西。我希望在SO上有更多有经验的JavaScript可以帮助我解决这个问题并给我一些关于如何更优雅地处理这个问题的指导。

编辑我还没有真正想过发电机。但如果包括在内,他们会帮忙吗

0 个答案:

没有答案