有时我需要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