【问题标题】:How do I make a custom function that returns a promise?如何制作返回承诺的自定义函数?
【发布时间】:2017-10-31 16:55:48
【问题描述】:

我创建了一个在我的数据库中查找文档的函数。 这是一个自定义函数,我将在我的控制器中将值传递给它的参数。然后我想在之后使用 .then() 。这是我的代码。

自定义函数

  getProjectsList(userId) {
    const query = { users: { $in: [userId] }, isDeleted: false };
    Project.find(query);
  },

在我的控制器中

projectsList(req, res) {
  projectModule.getProjectsList(req.user.id)
    .then(() => {   // this is not recognized
         // do something here
    });
},

请帮忙。我尝试了类似的方法,但它不起作用

getProjectsList(userId) {
 return new Promise(() => {
  const query = { users: { $in: [userId] }, isDeleted: false };
  Project.find(query);
 });
},

【问题讨论】:

  • Project.find 是否返回承诺...?然后return Project.find(query);.
  • 哦,我是个白痴。我忘了在 project.find 之前输入 return。 tsk2
  • 是的2。我想到了。无论如何谢谢:)
  • 仅供参考:return new Promise(() => { - 返回一个永远无法解决的 Promise :p - 但你缺少 return 是问题
  • 是的,我太笨了。哈哈

标签: javascript node.js mongodb promise mongoose-schema


【解决方案1】:

你可以使用回调函数。试试这个

projectsList(req, res) {

projectModule.getProjectsList(req.user.id, function(err, result){

if(err){
    res.json({
        "result" : "failure"
    });
}

    res.json({
        "result" : "success"
    });
});
};

在这里获取项目列表功能

getProjectsList(userId, callback) {

const query = { users: { $in: [userId] }, isDeleted: false };

Project.find(query, function(err, result){
    if(err){
        return callback(err);
    }

    callback(null, result);

});
};

【讨论】:

    【解决方案2】:

    Project.find() 方法必须返回回调或承诺。让我们假设它正在返回一个承诺,因此 Project.find() 的代码将是

    Project.find(query)
    .then(function(result){// success handling})
    .catch(function(error){ //error handling })
    

    现在你想创建一个新的函数 getProjectsList 作为一个 Promise 并将 Project.find() 放入其中。

    所以可以写成

    function getProjectsList(userId){
          return new Promise(function(resolve,reject){
    
                    Project.find(query)
                    .then(function(result){
                          // success handling
                          resolve(result);
                      })
                    .catch(function(error){ 
                         //error handling
                         reject(error);
                     })
          })
    }
    

    【讨论】:

    • 但是当你想对响应执行一些业务逻辑并保持主代码流干净时,这种模式很有帮助@trincot
    • 我不会称之为 clean。它被称为反模式是有原因的。 从不有充分的理由像这样滥用 Promise 构造函数。
    猜你喜欢
    • 2015-04-27
    • 2021-04-18
    • 1970-01-01
    • 2019-05-23
    • 2018-12-17
    • 2015-09-27
    • 2019-07-30
    相关资源
    最近更新 更多