我试图检查某个对象(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' ) );
}
})
}
答案 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' ) );
}
})
}