【问题标题】:ioredis bluebird a promise was created in a handler but was not returned from itioredis bluebird 在处理程序中创建了一个承诺,但没有从它返回
【发布时间】:2017-05-13 20:29:02
【问题描述】:

有人可以向我解释为什么我会收到此警告警告:在处理程序中创建了一个承诺,但没有从它返回,当我执行以下代码时:

cache['deviceSlave'].getBySystemId(systemId).then(function(slavesMapping) {

    // do other stuff

}).catch(function(err) {

    // throw error

});

下面是剩下的代码:

var Promise = require('bluebird');
var _ = require('lodash');
var Redis = require('ioredis');
var config = require('/libs/config');

var redis = new Redis({
    port: config.get('redis:port'),
    host: config.get('redis:host'),
    password: config.get('redis:key'),
    db: 0
});


var self = this;

module.exports.getBySystemId = function(systemId) {

    return new Promise(function(resolve, reject) {

        var systemIds = [systemId];

        self.getBySystemIds(systemIds).then(function(result) {

            return resolve(_.values(result)[0]);

        }).catch(function(err) {

            return reject(err);

        });

    });

};


module.exports.getBySystemIds = function(systemIds) {

    return new Promise(function(resolve, reject) {

        var pipeline = redis.pipeline();

        _.each(systemIds, function(systemId) {

            var cacheKey = 'device_slaves:' + systemId.replace(/:/g, '');

            // get through pipeline for fast retrieval
            pipeline.get(cacheKey);

        });


        pipeline.exec(function(err, results) {

            if (err) return reject(err);
            else {

                var mapping = {};

                _.each(systemIds, function(systemId, index) {

                    var key = systemId;
                    var slaves = JSON.parse(results[index][1]);

                    mapping[key] = slaves;


                });

                return resolve(mapping);

            }

        });


    });

};

我正在使用以下库:ioredis 和 bluebird。 代码执行良好,一切正常!我只是不喜欢收到无法解决的警告这一事实!

【问题讨论】:

    标签: promise warnings bluebird ioredis


    【解决方案1】:

    Bluebird 在这里警告您不要使用explicit construction。以下是您应该如何编写上述代码:

    module.exports.getBySystemId = function(systemId) {
      return self.getBySystemIds([systemId]).then(result => _.values(result)[0]);
    };
    

    没有必要包装承诺 - 作为承诺链:)

    【讨论】:

    • 这听起来多么愚蠢,我真的认为这会解决我的问题......但事实并非如此。 :(,还有其他建议吗?
    猜你喜欢
    • 2016-10-18
    • 2017-11-02
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多