Saya memiliki proyek yang dimulai sebagai ES5.1, kemudian saya mengubahnya untuk mendukung ES6 jadi saya menggunakan async-menunggu, biarkan ...

Sekarang saya perlu memiliki modul/objek yang seperti instance.

Saya menemukan postingan ini yang menjelaskan prosesnya, tapi...

Ketika saya melakukan:

'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;

Tapi sekarang, setiap kali saya melakukannya:

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;

Saya mendapatkan this.mappings DIGANTI di SafeRequestHandler mis. itu BUKAN sebuah contoh.

Jadi saya mencoba pendekatan ES6 mendefinisikan pawang:

'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);
        }
    }

}

Dan instantiate seperti:

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;

..tapi dengan cara ini saya bahkan tidak bisa menjangkau mappings di safeHandleReq(...). this tidak terdefinisi, mappings tidak terdefinisi

Saya pikir saya tidak sepenuhnya memahami prinsip-prinsip dasar, jadi bisakah Anda mengoreksi & menjelaskan apa yang salah dengan kedua pendekatan ini?

Terima kasih!

0
greengold 8 Agustus 2017, 16:36

2 jawaban

Jawaban Terbaik

Anda akan kehilangan konteks jika Anda menyimpan method dari instance kelas tertentu ke dalam variabel.

// 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

Ubah ke:

const instance = new SafeRequestHandler(handlerMappings);

const handle = (...args) => instance.safeHandleReq(...args);

Info lebih lanjut di sini: Kehilangan konteks "ini" dalam JavaScript saat melewati anggota

1
Hitmands 8 Agustus 2017, 13:51

Kode pertama Anda membuat variabel global, jadi hanya ada satu nilai. Anda juga dapat menggunakan ini di sana:

 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;
0
Jonas Wilms 8 Agustus 2017, 13:44