如何检查对象是否是node.js流实例?

时间:2015-08-20 08:10:28

标签: javascript node.js this instance

我试图检查某个对象(this)是否是一个流实例。我很难确定它是否仍然是功能中的原始this内部,就像函数触发时一样。

我已尝试typeof this并返回object。 我看过这个问题并没有找到明确的答案..有什么建议吗?先谢谢

StreamName.prototype._getEndpointData = function ( endpoint ) {
    /* 
    Make a request based on a specific endpoint 
    */
    var apikey = this.source.apikey;

    request.getAsync( { 
        headers: { 
            // 'content-type' : 'application/x-www-form-urlencoded',
            'User-Agent': 'request',
            'Authorization': getAuthByApikey( apikey )
        },
        url: generateUrl( apikey, endpoint )
        })
        .get( 1 ) // get the body 
        .then( function ( body ) {
            if ( body == 'Authentication Failed' ) {
                 throw new Error( body );
            }
            return body;
        })
        .then( JSON.parse )
        .then( function ( body ) {
            if ( body.status == 500 ) {
                throw new Error( body.message || 'MailChimp API request error');
            }

            // collections: lists, campaigns & reports
            var collection = body[ endpoint ]; 

            for (var i in collection ){
                var instanceEndpoint = endpoint + '/' + collection[i].id;

                request.getAsync( { 
                    headers: {
                        'User-Agent': 'request',
                        'Authorization': getAuthByApikey( apikey )
                    },
                    url: generateUrl( apikey, instanceEndpoint )
                    })
                    .get( 1 ) // get the body 
                    // .then( console.log)
                    .then( function ( body ) {
                        if ( body == 'Authentication Failed' ) {
                                throw new Error( body );
                    }
                    return body;
                    })
                    .then( JSON.parse )
                    .then( function ( body ) {
                        return body;
                    })
                    .then( this.push.bind( this ) )
                    // Getting an error Unhandled rejection TypeError: Cannot read property 'bind' of undefined
                    // IS 'THIS' as the same as it was at top of the function?
                    .then( this.push.bind( this, null ) )
                    .catch( this.emit.bind( this, 'error' ) );
            }
        })
}

2 个答案:

答案 0 :(得分:2)

您应该使用instanceof运算符:

var stream = require('stream');
var isStream = this instanceof stream.Readable;

虽然可能存在其他一些问题,但您可以在此处阅读:nodejs: Check if variable is readable stream

答案 1 :(得分:2)

this这里是指request.getAsync

.then( this.push.bind( this, null ) )

你需要在函数的开头保存this对某个变量的引用,然后你可以在以后引用它

StreamName.prototype._getEndpointData = function ( endpoint ) {
    /* 
    Make a request based on a specific endpoint 
    */
    var apikey = this.source.apikey;
    var _stream = this;

    request.getAsync( { 
        headers: { 
            // 'content-type' : 'application/x-www-form-urlencoded',
            'User-Agent': 'request',
            'Authorization': getAuthByApikey( apikey )
        },
        url: generateUrl( apikey, endpoint )
        })
        .get( 1 ) // get the body 
        .then( function ( body ) {
            if ( body == 'Authentication Failed' ) {
                 throw new Error( body );
            }
            return body;
        })
        .then( JSON.parse )
        .then( function ( body ) {
            if ( body.status == 500 ) {
                throw new Error( body.message || 'MailChimp API request error');
            }

            // collections: lists, campaigns & reports
            var collection = body[ endpoint ]; 

            for (var i in collection ){
                var instanceEndpoint = endpoint + '/' + collection[i].id;

                request.getAsync( { 
                    headers: {
                        'User-Agent': 'request',
                        'Authorization': getAuthByApikey( apikey )
                    },
                    url: generateUrl( apikey, instanceEndpoint )
                    })
                    .get( 1 ) // get the body 
                    // .then( console.log)
                    .then( function ( body ) {
                        if ( body == 'Authentication Failed' ) {
                                throw new Error( body );
                    }
                    return body;
                    })
                    .then( JSON.parse )
                    .then( function ( body ) {
                        return body;
                    })
                    .then( _stream.push.bind( this ) )

                    //should replace this with _stream
                    .then( _stream.push.bind( this, null ) )
                    .catch( _stream.emit.bind( this, 'error' ) );
            }
        })
}