搜尋

首頁  >  問答  >  主體

javascript - node中Promise也被嵌套了

1.

假如有兩個mongodb集合,一個是users,一個是posts,在posts列表中展示對應的users信息,常規異步處理嵌套太多.就使用Promise來解決,發現,promise解決時也有一個問題.

2. 解決程式碼如下

//封装查询一条函数
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);
    });

這樣的方法是否正確?貌似是解決了,但是總感覺哪裡不對,,,,

世界只因有你世界只因有你2760 天前776

全部回覆(5)我來回復

  • PHP中文网

    PHP中文网2017-06-05 11:13:11

    promise不是最終解決方案也看不見得比回調優雅多少 async/await才是

    回覆
    0
  • 滿天的星座

    滿天的星座2017-06-05 11:13:11

    有三點,直接把上面的程式碼寫在db_conn的then裡面,然後回傳this.
    在最外層統一使用catch捕捉異常。
    將console.log給刪了,看起來怪怪的,

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-05 11:13:11

    db_conn()
    .then(db=>{
            return {
                   db:db,
                   test:'test',
                   data:{}
             }
    })
    .then(findOneData)
    .then(r=>{
       console.log(r);
    });

    最後把你的findOneData改一下接收參數的方式,是不是好點了?

    回覆
    0
  • PHPz

    PHPz2017-06-05 11:13:11

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

    這樣是不是更順眼?

    回覆
    0
  • 迷茫

    迷茫2017-06-05 11:13:11

    Promise 方案是在不增加語言元素的基礎上解決非同步回調的問題,所以必然存在一些限制。

    在原有的回調之上,Promise 至少會增加一層回調,所以在原回調鏈很短的情況下,比如題主的情況,只有一層,看起來用 Promise 似乎並無優勢,這也是正常的。

    如果遇到更複雜的情況,更多層次的嵌套,就能看出用 Promise 的價值了。

    樓上各位都提供了很好的寫法,我就不多說了。

    回覆
    0
  • 取消回覆