時々、Meteor.callをwriteMeLater
にして、キューに入れて同期的に実行する必要があります(同じクライアントからwriteMeLater
への他の呼び出しをブロックする)。Meteor.methodsを同期非同期にする
writeMeLater
への呼び出しは、現在キューに入れられているすべてのコールの後にキューイングすることなく、できるだけ早く実行する必要があります。
async
パラメータがtrueの場合、this.unblock()
を使用して私の試みを以下に示します。ケース1と2はうまく動作します。しかし、ケース3ではasync=true
のコールがasync=false
のコールの後にキューに入れられています! async=true
で通話をスキップするにはどうすればよいですか?
Meteor.call('writeMeLater', 's', false)
Meteor.call('writeMeLater', 's', false)
Meteor.call('writeMeLater', 's', false)
:これはすべて
Meteor.call()
がクライアント
ケース1(正しく同期)から作られています
、最初のクライアントからの呼び出しの後にキューイングされていない2番目のクライアントから呼び出す方法のようになります。
ケース2(正しくは非同期):
Meteor.call('writeMeLater', 'a', true)
Meteor.call('writeMeLater', 'a', true)
Meteor.call('writeMeLater', 'a', true)
ケース3(ない、目的の動作)
Meteor.call('writeMeLater', 's', false)
Meteor.call('writeMeLater', 's', false)
Meteor.call('writeMeLater', 's', false)
Meteor.call('writeMeLater', 'a', true)
Meteor.call('writeMeLater', 'a', true)
Meteor.call('writeMeLater', 'a', true)
サーバー/ main.js
writeMeLater = function(data, callback) {
console.log('writeMeLater: ', data)
// simulate taking 3 second to complete
Meteor.setTimeout(function() {
Logs.insert({data: data, timestamp: new Date().getTime()})
console.log('Log.insert: ', data)
callback(null, 'done')
}, 3 * 1000)
}
writeMeLaterSync = Meteor._wrapAsync(writeMeLater)
Meteor.methods({
writeMeLater: function(data, async) {
if(async)
this.unblock()
writeMeLaterSync(data)
}
})
あなたは何を期待していますか? – imslavko
@imslavko他のクライアントからのメソッド呼び出しが最初のクライアントからの呼び出しの後ろにどのようにキューされていないかのように、いくつかのメソッド呼び出しをキューに入れるのではなく、すぐに実行することは可能ですか? – Nyxynyx
これはまさに 'this.unblock() '呼び出しはこれを行います - これは、前の接続が完了する前に、* start *への現在の接続を別のメソッド呼び出しで許可します。それは私が見る出力です:http://pastebin.com/gtdgLTGfそしてそれは私に見えます。 3つの同期コールの場合、コールが終了するまでに3秒の遅延があります。 2回目のバッチでは、それらはすべて同時に開始し、3秒後に終了します。 – imslavko