代码之家  ›  专栏  ›  技术社区  ›  greengold

NodeJ中模块函数/类的实例

  •  0
  • greengold  · 技术社区  · 7 年前

    我有一个项目最初是ES5.1,后来我将其更改为支持ES6,所以我使用了async await,let。。。

    我找到了 this 帖子解释了过程,但是。。。

    当我这样做时:

    'use strict';
    
    let _ = require('lodash');
    var mappings;
    
    function SafeRequestHandler(reqMappings) {
    
        if (!(this instanceof SafeRequestHandler)) {
            return new SafeRequestHandler((reqMappings));
        }
    
        mappings = reqMappings;
    }
    
    function safeHandleReq(req, res) {
        try {
            let pair = _.find(mappings, {'url': req.url});
            return pair.handler(req, res);
        } catch (err) {
            console.log(err);
        }
    }
    
    SafeRequestHandler.prototype.safe = safeHandleReq;
    
    module.exports = SafeRequestHandler;
    

    但现在,每次我这样做:

    var handler = require('../util/safeRequestHandler');
    
    let handlerMappings = [
        {
            url: def.party_create,
            handler: partyCreate
        },
        {
            url: def.party_modify,
            handler: partyModify
        },
        {
            url: def.party_get,
            handler: partyGet
        }
    ];
    
    var handle = new handler(handlerMappings).safe;
    

    我明白了 this.mappings SafeRequestHandler 这不是一个例子。

    所以我尝试了ES6方法来定义处理程序:

    'use strict';
    
    let _ = require('lodash');
    
    class SafeRequestHandler {
    
        constructor(reqMappings) {
            this.mappings = reqMappings;
        }
    
        safeHandleReq(req, res) {
            try {
                let pair = _.find(this.mappings, {'url': req.url});
                return pair.handler(req, res);
            } catch (err) {
                console.log(err);
            }
        }
    
    }
    

    并将其实例化为:

    let handlerMappings = [
        {
            url: def.party_create,
            handler: partyCreate
        },
        {
            url: def.party_modify,
            handler: partyModify
        },
        {
            url: def.party_get,
            handler: partyGet
        }
    ];
    
    let handle = new SafeRequestHandler(handlerMappings).safeHandleReq;
    

    mappings 在里面 safeHandleReq(...) this 未定义, 映射 未定义

    我想我只是没有完全理解基本原理,所以你能纠正一下吗;解释这两种方法有什么问题?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Hitmands    7 年前

    如果存储 method 将特定类实例转换为变量。

    // handle doesn't have a pointer to its context (aka, this)
    let handle = new SafeRequestHandler(handlerMappings).safeHandleReq;
    // so handle() will output cannot read property mappings of undefined
    

    const instance = new SafeRequestHandler(handlerMappings);
    
    const handle = (...args) => instance.safeHandleReq(...args);
    

    更多信息请点击此处: Losing "this" context in JavaScript when passing around members

        2
  •  0
  •   Jonas Wilms    7 年前

    价值你可以使用

     let _ = require('lodash');
    function SafeRequestHandler(reqMappings) {
      if (!(this instanceof SafeRequestHandler)) {
        return new SafeRequestHandler((reqMappings));
      }
       this.mappings = reqMappings;
    }
    
    SafeRequestHandler.prototype.safeHandleReq =  function(req, res) {
        try {
            let pair = _.find(this.mappings, {'url': req.url});
            return pair.handler(req, res);
        } catch (err) {
            console.log(err);
        }
    }
    module.exports = SafeRequestHandler;