javascript - Promise im Knoten ist ebenfalls verschachtelt
世界只因有你
世界只因有你 2017-06-05 11:11:11
0
5
781

1.

Wenn es zwei Mongodb-Sammlungen gibt, eine für Benutzer und die andere für Beiträge, und die entsprechenden Benutzerinformationen in der Beitragsliste angezeigt werden, ist die herkömmliche asynchrone Verarbeitung zu verschachtelt, um das Problem zu lösen, und es wurde festgestellt, dass es auch eine gibt Problem beim Lösen von Versprechen

2. Der Lösungscode lautet wie folgt

//封装查询一条函数
findOneData = function(db, colName, data) {
    return new Promise(function(reslove, reject) {
        db.collection(colName).find(data).toArray(function(err, data) {
            if (err) {
                console.log("数据查询错误" + err);
                reject(err);
                return;
            }
            reslove({ db: db, data: data });
        });
    });
};

db_conn()
    .then(function(db) {
        return findOneData(db, "test", {});
    })
    .then(function(data) {
        console.log(data);
    });

Ist diese Methode richtig? Sie scheint gelöst zu sein, aber ich habe immer das Gefühl, dass etwas nicht stimmt
世界只因有你
世界只因有你

Antworte allen(5)
洪涛

promise不是最终解决方案也不见得比回调优雅多少 async/await才是

滿天的星座

有三点,直接把上面的代码写在db_conn的then里面,然后返回this.
在最外层统一使用catch捕捉异常。
将console.log给删了,看起来怪怪的,

我想大声告诉你
db_conn()
.then(db=>{
        return {
               db:db,
               test:'test',
               data:{}
         }
})
.then(findOneData)
.then(r=>{
   console.log(r);
});

最后把你的findOneData改一下接收参数的方式,是不是好点了?

PHPzhong
db_conn()
    .then(db => findOneData(db, "test", {}))
    .then(data => console.log(data));

这样看起来是不是要顺眼些?

(async function() {
    const db = await db_conn();
    const data = await findOneData(db, "test", {});
    console.log(data);
})();

这样是不是更顺眼些?

迷茫

Promise 方案是在不增加语言元素的基础上解决异步回调的问题,所以必然存在一些局限性。

在原有的回调之上,Promise 至少会增加一层回调,所以在原回调链很短的情况下,比如题主的情况,只有一层,看起来用 Promise 似乎并无优势,这也是正常的。

如果遇到更复杂的情况,更多层次的嵌套,就能看出用 Promise 的价值了。

楼上各位都提供了很好的写法,我就不多说了。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage