如何在bookshelf中替换嵌套的.then()函数

时间:2017-05-04 17:09:39

标签: node.js bookshelf.js

我是node.js的新手,我在删除bookshelf.js函数中的多个嵌套.then()时遇到了问题。

以下代码就是我现在正在处理的问题。它现在工作正常,但我需要添加20多个嵌套.then()来完成项目。因此,我试图在它变得疯狂之前将.then()替换为其他方法。

任何帮助或提示都将不胜感激。

   getItem: function (req, res, next) {

        DepartmentCollection.forge()
        .fetch({
              debug: true     
        })
        .then(function(collection) {
             new GlossaryTerm({'GlossaryTermID': req.params.id}).fetch({
                    withRelated: ['department'],
                    debug: true     
           })
              .then(function(model) {
                    if ("undefined" === typeof collection) { console.log("step 2: variable is undefined") }
                    else { console.log("step 2: variable is defined") };

                    res.render('glossary/glossary-term-detail',{domain:'GlossaryTerm', title: 'Glossary Term Detail',
                                                                  data: model, department_data: collection }); 

              }).catch(function(error) {
                    console.log(error);
                    res.send('An error occured');
              }); 

        }).catch(function(error) {
              console.log(error);
              res.send('An error occured');
        });

  }

2 个答案:

答案 0 :(得分:0)

我强烈推荐co库。

npm install co --save

然后你可以让这些电话出现'同步并避免一些厄运类型问题的金字塔。

const co = require('co');

co(function* () {
  const resultOne = yield asyncCallOne();
  const resultTwo = yield asyncCallTwo();

  try {
    const resultThree = yield asyncCallThree();
  } catch (error) {
    console.log(error);
  }

  // and so on, and so on.
});

答案 1 :(得分:0)

通常你不需要嵌套。 thenable的结果成为下一个的输入。所以大多数时候你可以而不是嵌套

getItem: function (req, res, next) {
  // Creating a closure for storing intermediate then() results
  let collection;
  // Making getItem() a promise itself
  return DepartmentCollection
    .forge()
    .fetch({
      debug: true     
    })
    .then(function(fetched_collection) {
      collection = fetched_collection;
      if ("undefined" === typeof collection) { 
        console.log("step 2: variable is undefined")
      } else { 
        console.log("step 2: variable is defined")
      }
      return new GlossaryTerm({'GlossaryTermID': req.params.id})
        .fetch({
                withRelated: ['department'],
                debug: true     
        });
    })    
    .then(function(model) {
      res.render('glossary/glossary-term-detail', {
        domain:'GlossaryTerm', 
        title: 'Glossary Term Detail',
        data: model, 
        department_data: collection }); 
    })
    .catch(function(error) {
      console.log(error);
        res.send('An error occured');
    }); 
}

例外情况是必须将逻辑拆分为更多使用不同方式提供结果的链。在这些情况下,建议将复杂逻辑移动到另一个函数(返回一个promise):

所以这个

function complex() {
  return f1()
    .then(x => {
      if (!x) {
        return f2()
          .then(f3);
      }
      return f3();
    })
    .then(...);      
}

成为这个:

function complex() {
  function f4(x) {
    if (!x) {
      return f2()
        .then(f3);
    }
    return f3();
  }
  return f1()
    .then(f4)
    .then(...);    
}