【问题标题】:Blue bird return promise missing warning蓝鸟归还承诺缺失警告
【发布时间】:2023-03-31 03:13:02
【问题描述】:

我使用以下代码并收到警告

警告:在处理程序中创建了一个承诺,但没有从 它

var Promise = require("bluebird");
var glob = Promise.promisify(require('glob'));

glob("files/*.js")
            .then(function (files) {
               files.forEach(function (file) {
                    ...
                     invoke(data,response,fn,entity,req);
                });
            }).catch(function (err) {
                console.log('error: ', err);
            }
        )

我应该怎么做才能避免它?

我看了BB的文档,看来我应该returnpromise

我的问题是在哪里?我猜是在调用函数内部,但不确定如何

这是 inovke 函数

var invoke = function (data,res,fn,entity,req) {
....
    for (var data in entity.app[0]) {

         var name = entity.app[0].function;
                try {
                    fn[name](req, res);
                }
                catch (err) {
                    res.status(500).send("Error" + err);
                }
                if (!res.headerSent) {
                    res.end("done", 200);
                }
            }
        }
    }
};

此外,我还尝试像以下那样返回承诺,但这是行不通的

var invoke = function (data,res,fn,entity,req) {
....
  return new Promise(function (resolve, reject) {
    for (var data in entity.app[0]) {

         var name = entity.app[0].function;
                try {
                    resolve(fn[name](req, res));
                }
                catch (err) {
                    res.status(500).send("Error" + err);
                }
                if (!res.headerSent) {
                    res.end("done", 200);
                }
            }
        }
    }
};

我不想抑制警告我想了解如何解决它...

如果我需要添加一些其他信息,请告诉我,我卡在这里:(

【问题讨论】:

    标签: javascript node.js promise q bluebird


    【解决方案1】:

    我没有测试下面的代码,但你应该有这样的方法:

    var Promise = require("bluebird");
    var glob = Promise.promisify(require('glob'));
    
    glob("files/*.js").then(function (files) {
    
        return Promise.all(files.map(function (file) {
                return invoke(data,response,fn,entity,req);
            })
        );
    }).catch(function (err) {
        console.log('error: ', err);
        res.status(500).send("Error" + err);
    }).finally(function(){
        if (!res.headerSent) {
            res.end("done", 200);
        }
    });
    
    var invoke = function (data,res,fn,entity,req) {
    
        return new Promise(function (resolve, reject) {
            for (var data in entity.app[0]) {
    
                 var name = entity.app[0].function;
                 try {
                     fn[name](req, res);
                 }
                 catch (err) {
                    reject(err);
                 }
            }
        }
    };
    

    【讨论】:

    • 非常感谢!这解决了难以理解的问题(至少对我来说),请问为什么这解决了问题,而不仅仅是返回...
    • 您需要将新的 Promise 返回到链中,并且当您创建多个 Promise 时,需要使用 Promise.all()。当您在调用函数上捕获错误时,只需拒绝该特定承诺即可将错误传播到链上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2014-11-06
    • 2015-09-06
    相关资源
    最近更新 更多