4

Meteor.methods 呼び出し内から変数にアクセスしようとしましたがthis.userId、Meteor.setTimeout または Meteor.setInterval を介してメソッドを呼び出そうとしても機能しないようです。

これは私が持っているものです:

if (Meteor.is_server) {
    Meteor.methods({
        getAccessToken : function() {
            try {
                console.log(this.userId);
                return Meteor.users.findOne({_id: this.userId}).services.facebook.accessToken;
            } catch(e) {
                return null;
            }
        }
    });

    var fetch_feed = function() {
        console.log(Meteor.call("getAccessToken"));
        [...] // A bunch of other code
    };

    Meteor.startup(function() {
        Meteor.setInterval(fetch_feed, 60000); // fetch a facebook group feed every minute
        Meteor.setTimeout(fetch_feed, 3000); // initially fetch the feed after 3 seconds
    });
}

端末ログを見ると、 はthis.userId常に null を返します。しかし、クライアント側から、またはコンソールからメソッドを呼び出そうとすると、正しい ID が返されます。

これが Meteor.setInterval 内から機能しないのはなぜですか? それはバグですか、それとも何か間違ったことをしていますか?

4

2 に答える 2

-1

私が使用した解決策があります-メソッドを関数にしたくないが、実際にはメソッドのままにしたい場合があります。その場合、これを機能させるためのハック:

            var uniqueVar_D8kMWHtMMZJRCraiJ = Meteor.userId();
            Meteor.setTimeout(function() {
                    // hack to make Meteor.userId() work on next async 
                    // call to current method
                    if(! Meteor._userId) Meteor._userId = Meteor.userId;
                    Meteor.userId = function() {
                        return Meteor._userId() || uniqueVar_D8kMWHtMMZJRCraiJ
                    };
                    Meteor.apply(methodName, args);
                }
            , 100);

簡単な説明: true の場合は返す関数で上書きMeteor.userIdし、そうでない場合は、これが発生する前の履歴値を返します。その履歴値は、コンテキストの競合が発生しないように、2 回発生することのない var 名に保存されます。Meteor._userIdMeteor.userIdMeteor._userId()Meteor.userId()

于 2015-07-27T16:00:46.070 に答える