Javascript 在承诺中为回调添加超时并拒绝
我正在将socket.io的emit函数转换为这样的承诺Javascript 在承诺中为回调添加超时并拒绝,javascript,node.js,socket.io,bluebird,Javascript,Node.js,Socket.io,Bluebird,我正在将socket.io的emit函数转换为这样的承诺 var io = require("socket.io-client") var Promise = require("bluebird") var _ = require("underscore") io.emitAsync = function(event, payload){ return new Promise(function (resolve, reject) { return io.emit(event, pa
var io = require("socket.io-client")
var Promise = require("bluebird")
var _ = require("underscore")
io.emitAsync = function(event, payload){
return new Promise(function (resolve, reject) {
return io.emit(event, payload, function(){
var args = _.toArray(arguments)
if(args[0]) reject(new Error(args[0]))
resolve.apply(null, args)
})
})
}
我无法使用promiseify
,因为io.emit
回调没有返回节点样式的回调签名。因此,计划是传递字符串错误消息,如果第一个参数是truthy
,则上述承诺将被拒绝。这一切都很好,但问题出在这里
如果您没有在套接字中返回回调
。在
上,则上述承诺将永远不会解决
或拒绝
任何内容。所以我需要的是一个超时,这个回调
,如果在分配的时间段内没有返回任何内容,那么它将拒绝(新错误(“超时”)
。问题是我不知道该怎么做。理想情况下,我可以将秒设置为在上述函数中等待,或者如果知道给定事件没有回调,我希望解析,因此理想情况下,它是emitAsync
本身的一个参数。想法?你当然可以用
较低级别的解决方案是使用setTimeout
:
new Promise(function (resolve, reject) {
io.emit(event, payload, function(err){
if(err) reject(new Error(err))
resolve(_.toArray(arguments).slice(1));
})
setTimeout(function(){
reject(new Error("timeout"));
}, seconds*1000);
})
当然,你可以用
较低级别的解决方案是使用setTimeout
:
new Promise(function (resolve, reject) {
io.emit(event, payload, function(err){
if(err) reject(new Error(err))
resolve(_.toArray(arguments).slice(1));
})
setTimeout(function(){
reject(new Error("timeout"));
}, seconds*1000);
})
当然,你可以用
较低级别的解决方案是使用setTimeout
:
new Promise(function (resolve, reject) {
io.emit(event, payload, function(err){
if(err) reject(new Error(err))
resolve(_.toArray(arguments).slice(1));
})
setTimeout(function(){
reject(new Error("timeout"));
}, seconds*1000);
})
当然,你可以用
较低级别的解决方案是使用setTimeout
:
new Promise(function (resolve, reject) {
io.emit(event, payload, function(err){
if(err) reject(new Error(err))
resolve(_.toArray(arguments).slice(1));
})
setTimeout(function(){
reject(new Error("timeout"));
}, seconds*1000);
})
呃,节点样式的回调不坚持第一个参数是错误
实例promisify
在这里应该可以很好地工作,在第一个参数是真实的时候拒绝。@Bergi很高兴知道!但是,在分配的时间段内没有回调时,仍然无法拒绝。还要注意,resolve
只接受一个参数,因此不确定如何使用该apply
。呃,节点样式回调不坚持第一个参数是错误
实例promisify
在这里应该可以很好地工作,在第一个参数是真实的时候拒绝。@Bergi很高兴知道!但是,在分配的时间段内没有回调时,仍然无法拒绝。还要注意,resolve
只接受一个参数,因此不确定如何使用该apply
。呃,节点样式回调不坚持第一个参数是错误
实例promisify
在这里应该可以很好地工作,在第一个参数是真实的时候拒绝。@Bergi很高兴知道!但是,在分配的时间段内没有回调时,仍然无法拒绝。还要注意,resolve
只接受一个参数,因此不确定如何使用该apply
。呃,节点样式回调不坚持第一个参数是错误
实例promisify
在这里应该可以很好地工作,在第一个参数是真实的时候拒绝。@Bergi很高兴知道!但是,在分配的时间段内没有回调时,仍然无法拒绝。还要注意,resolve
只接受一个参数,因此不确定如何使用该apply
。