控制承诺中的执行流程

时间:2018-11-01 03:40:11

标签: javascript promise

在下面的代码中,为什么在调用代码块中执行.then(result)之前,get_dbinfo中的promise无法解析?

我的理解是,新Promise中的代码将在返回调用语句的.then部分之前完成。

    dbFuncs.get_dbinfo()
    .then((result) => {
      count = result.info.doc_count
      if (count < 500){perPage = count};
    });

    function get_dbinfo() {
      return new Promise((resolve, reject) => {
        return db.info()
        .then((result) => {
            resolve(result)
        }).catch((err) => {
            console.log(err);
            reject(err)
        });
    });
    }

1 个答案:

答案 0 :(得分:0)

弄清楚了。第一个问题不是返回对get_dbinfo的第一个调用,我没有这样做,因为它将函数的post Promise部分标记为“由于同一函数内有两次返回而无法到达”,这使我进入了第二个部分该问题试图在同一功能中包含两个不同的承诺链。

最终的解决方案是将所有内容置于单个诺言链中,并在第一次调用dbFuncs时重新进行调整,如下所示。没有对get_dbinfo()进行任何更改。

    var count = 0;
      var perPage = 500;
      var page = req.query.p || 1;

    return dbFuncs.get_dbinfo()
    .then((result) => {
      count = result.doc_count
      if (count < 500){perPage = count};
    return db.find({
        selector: {
          $and: [
            {last_name: { '$gt': 1}},
          ]
        },
        use_index: ['patients'],
        sort: [{'last_name': 'asc'}],
        skip: ((perPage * page) - perPage),
        limit: perPage

      }).then((docs) => {
        let pages = Math.ceil(count / perPage);
        res.render("patients", {
          pagination: {
            currentpage: page,
            page: pages
          },
            obj: docs,
            current: page,
        });
      }).catch((err) => {
          console.log('error in patients_controller', err);
      });
    });
    };

对于后代,这个完整的块是将数据集(在本例中为pouchdb)分页到hbs模板的绝佳方法。