首页 > 解决方案 > 如何解决这些承诺链?

问题描述

我正在尝试为我的节点应用程序编写 2 条路由。1 条路线用于返回单个项目,1 条路线用于数组列表。

路线是这样的。

router
  .route("/:income_id")
  .get((req, res) => {
      Income.findById(req.params.income_id)
        .populate("services.service_id")
        .then((income) => {
          return filterIncomeFunc(income);
        })
        .then((result) => {
          return res.status(200).json(result);
        })
        .catch(function (error) {
          res.status(404).json({ msg: "Income not Found" });
        });
  });


 router
      .route("/")
      .get((req, res) => {
          Income.find({})
            .populate("services.service_id")
            .then((income) => { 
             //problem here
              return filterArrayIncome(income);
            })
            .then((result) => {
             console.log('======================');
             console.log(result);
             console.log('======================');
              return res.status(200).json(result);
            })
            .catch(function (error) {
              res.status(404).json({ msg: "Income not Found" });
            });
      });

因为我需要过滤其中的 2 个,所以我编写了 2 个名为filterArrayIncome&filterIncomeFunc

我的代码适用于单个项目,但数组函数不起作用,

这是我的过滤代码

const filterIncomeFunc = (income) => {
  return new Promise((resolve, reject) => {
    let filteredIncome = {};
    filteredIncome.services = income.services.map((service) => {
      return {
        service_name: service.service_id.service_name,
        price: service.price,
      };
    });
    filteredIncome.total_amount = income.total_amount;
    resolve(filteredIncome);
  });
};

const filterArrayIncome = (incomeArray) => {
  return new Promise((resolve, reject) => {
    let filteredIncome = incomeArray.map((eachIncome) => {
     return filterIncomeFunc(eachIncome);
    });
    resolve(filteredIncome);
  });
};

因为我想要干代码,所以我在filterIncomeFunc里面使用filterArrayIncome

在 filterArrayIncome 内部,console.log 结果是这样的。

======================
[
  Promise {
    {
      services: [Array],
      total_amount: 18000
    }
  },
  Promise {
    {
      
      services: [Array],
      total_amount: 18000
    }
  },
]
======================

是的,这些都是回报的承诺。我已经在filterArrayIncome函数内部解决了

标签: node.jspromise

解决方案


您可以在承诺链中使用非承诺。

Promise.resolve('a').then(() => 'b');

解析为“b”;

您的过滤器函数不需要返回承诺,只需让它们返回值。

他们返回承诺是没有意义的,因为无论如何他们都有同步操作所需的一切。


推荐阅读