当前位置:  开发笔记 > 编程语言 > 正文

蓝鸟警告"承诺是在处理程序中创建的,但未从中返回"

如何解决《蓝鸟警告"承诺是在处理程序中创建的,但未从中返回"》经验,为你挑选了2个好方法。

我收到了关于不从Bluebird返回创建的承诺的警告,我不明白为什么以及如何重写我的代码.

(我曾尝试阅读Bluebird API页面和反模式页面上的警告,因为我怀疑这是我正在做的事情)

在我的view.js文件中:

var express = require('express'),
    router = express.Router(),
    settings = myReq('config/settings'),
    Sets = myReq('lib/Sets'),
    log = myReq('lib/utils').getLogger('View');

router.get('/:setId/', function(req, res, next) {
    var
        setId = req.params.setId,  
        user = req.user,
        set = new Sets(setId, user);

    log.info('Got a request for set: ' + setId);

    // The below line gives the warning mentioned
    set.getSet().then(function(output) {
        res.send(output);

    }).error(function(e){
        log.error(e.message, e.data);
        res.send('An error occurred while handling set:' + e.message);
    });

});

module.exports = router;

在我的Sets.js文件中,我有:

var
    Promise = require('bluebird'),
    OE = Promise.OperationalError,
    settings = myReq('config/settings'),
    UserData = myReq('lib/userData'),
    log = myReq('lib/utils').getLogger('sets'),
    errorToSend = false;

module.exports = function(setId, user) {
    var 
        sets = myReq('lib/utils').getDb('sets');

    return {

        getSet : function() {

            log.debug('Getting set')

            return sets.findOneAsync({
                setId:setId
            }).then(function(set){
                if ( set ) {
                    log.debug('got set from DB');
                } else {
                    set = getStaticSet(setId);
                    if ( ! set ) {
                        throw new OE('Failed getting db records or static template for set: ' + setId );
                    }
                    log.debug('got static set');
                }

                log.debug('I am handling set')

                if ( ! checkSet(set) ) {
                    var e = new OE('Failed checking set');
                    e.data = set;
                    throw e;
                }

                return {
                    view : getView(set),
                    logic : set.logic,
                    canEdit : true,
                    error : errorToSend
                };

            });
        }
    };
};

因此,带有"set.getSet()"的view.js文件中的行给出了关于不返回创建的promise的警告.看起来这个脚本仍然按照我的预期行事,但我不明白为什么我会收到警告.

堆栈跟踪:

Warning: a promise was created in a handler but was not returned from it
    at Object.getSet (C:\dev\infoscrn\lib\Sets.js:36:25)
    at C:\dev\infoscrn\routes\view.js:39:20
    at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
    at next (C:\dev\infoscrn\node_modules\express\lib\router\route.js:110:13)
    at Route.dispatch (C:\dev\infoscrn\node_modules\express\lib\router\route.js:91:3)
    at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
    at C:\dev\infoscrn\node_modules\express\lib\router\index.js:267:22
    at param (C:\dev\infoscrn\node_modules\express\lib\router\index.js:340:14)
    at param (C:\dev\infoscrn\node_modules\express\lib\router\index.js:356:14)
    at Function.proto.process_params (C:\dev\infoscrn\node_modules\express\lib\router\index.js:400:3)
    at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:261:10)
    at Function.proto.handle (C:\dev\infoscrn\node_modules\express\lib\router\index.js:166:3)
    at router (C:\dev\infoscrn\node_modules\express\lib\router\index.js:35:12)
    at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
    at trim_prefix (C:\dev\infoscrn\node_modules\express\lib\router\index.js:302:13)
    at C:\dev\infoscrn\node_modules\express\lib\router\index.js:270:7
    at Function.proto.process_params (C:\dev\infoscrn\node_modules\express\lib\router\index.js:321:12)
    at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:261:10)
    at C:\dev\infoscrn\node_modules\express\lib\router\index.js:603:15
    at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:246:14)

Gunar Gessne.. 16

首先,尝试更新所有依赖项.最新版本的Bluebird修复了涉及此警告的问题.

接下来,确保从所有处理程序返回.

然后,如果您仍然收到警告(就像我一样),您可以禁用此特定警告.我选择通过设置BLUEBIRD_W_FORGOTTEN_RETURN=0我的环境来这样做.



1> Gunar Gessne..:

首先,尝试更新所有依赖项.最新版本的Bluebird修复了涉及此警告的问题.

接下来,确保从所有处理程序返回.

然后,如果您仍然收到警告(就像我一样),您可以禁用此特定警告.我选择通过设置BLUEBIRD_W_FORGOTTEN_RETURN=0我的环境来这样做.



2> brianmearns..:

不要禁用警告.他们是有原因的.

典型的模式是,如果你的onfulfill或onreject处理程序导致构造一个Promise,它将从处理程序返回Promise(或从它派生的某个链),这样链就会采用该Promise的状态.

所以Bluebird会跟踪它何时运行你的一个处理函数,并跟踪它何时调用Promise构造函数.如果确定在处理程序运行时(包括调用堆中的任何位置)在任何时刻创建了Promise ,但是没有从处理程序返回Promise ,则会发出此警告,因为它认为您可能忘记编写返回声明.

因此,如果您合法地不关心在处理程序中创建的Promise,您所要做的就是从处理程序中显式返回一些东西.如果你不关心从你的处理程序返回什么(即,如果你不关心Promise履行的价值),那么只需返回null.无论你返回什么,显式返回(特别是除了以外的返回值undefined)告诉Bluebird你认为你知道你正在做什么,它不会发出这个警告.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有