2016-08-03 19 views
1

でRxJSをしようとしたとき、私は、次のノードコード「例外TypeError:this._subscribeは関数ではありません」シンプルノードモジュール

//index.js 
var username = process.argv[2], 
    password = process.argv[3], 
    factories = require('./factories')(username, password); 

factories.subscribe(function(data){ 
    console.log(data.length); 
}); 
factories.refresh(); 

//factories.js 
var Rx = require('rx'); 
var factories = function(username, password){ 
    var factories = []; 
    var source = Rx.Observable.from(factories); 
    var baseUrl = "<url>", 
    factoriesOpt = { 
     'uri': baseUrl+"<path>", 
     'method': 'GET', 
     'auth': { 
     'user': username, 
     'pass': password 
     } 
    }, 
    response="", 
    request = require('request'); 

    var refresh = function(){ 
    request(factoriesOpt) 
     .on('data', function(chunk){ 
     if(chunk) 
      response += chunk; 
     }) 
     .on('end', function(){ 
     factories = JSON.parse(response); 
     }) 
    } 
    return { 
    subscribe : source.subscribe, 
    factories : factories, 
    refresh : refresh 
    }; 
}; 
module.exports = factories; 

を持っている。しかし、私はこれを実行すると、私はエラーを取得...

TypeError: this._subscribe is not a function 
    at Object.Rx.Observable.observableProto.subscribe.observableProto.forEach [as subscribe] (/Users/<code location>/node_modules/rx/dist/rx.js:2034:19) 
    at Object.<anonymous> (/Users/<code location>/index.js:5:11) 
    at Module._compile (module.js:409:26) 
    at Object.Module._extensions..js (module.js:416:10) 
    at Module.load (module.js:343:32) 
    at Function.Module._load (module.js:300:12) 
    at Function.Module.runMain (module.js:441:10) 
    at startup (node.js:139:18) 
    at node.js:968:3 

更新

私が使用する工場を変更する場合は...

var subscribe = function(callback){ 
    source.subscribe(callback); 
}; 
... 
return { 
    subscribe : subscribe, 
    factories : factories, 
    refresh : refresh 
}; 

動作しますが、折り返しは避けてください。

答えて

7

これはバインディングの問題であり、javascriptの細かい点の1つです。今詳細には入りませんが、基本的にsource.subscribeの代わりにsource.subscribe.bind(source)を実行してください。それがうまくいくなら私に教えてください、私はバインディングの問題についてもっと詳しく説明します。

バインディングミスを説明する参照が見つかりました:http://developer.telerik.com/featured/seven-javascript-quirks-i-wish-id-known-about/#functions。 #3を見てください。

+0

素晴らしい感謝のように見えます!私はリンクを見ていきます。 – Jackie

関連する問題