有時我需要Meteor.call到writeMeLater
排隊和同步執行(阻止來自同一客戶端的其他調用writeMeLater
)。使Meteor.methods同步和異步
其他時候應該儘快執行writeMeLater
的呼叫,而不排隊等待當前排隊的所有呼叫。
以下是我嘗試使用this.unblock()
如果async
參數爲true。案例1和2工作正常。但在案例3中,撥打async=true
的電話正在排隊等待async=false
!我們怎樣才能撥打async=true
跳過隊列?這將是類似於如何從第二個客戶端從第一客戶端調用後不排隊呼叫,
所有Meteor.call()
從客戶端進行
案例1(正常同步):
Meteor.call('writeMeLater', 's', false)
Meteor.call('writeMeLater', 's', false)
Meteor.call('writeMeLater', 's', false)
案例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() 'call會做 - 它將允許另一個方法調用當前連接到* start *,然後完成上一個操作。這是我看到的輸出:http://pastebin.com/gtdgLTGf它看起來對我來說是正確的。對於3個同步呼叫,在呼叫結束前有3秒延遲。對於第二批 - 它們都在同一時間開始並在3秒後結束。 – imslavko