Javascript 在承诺中为回调添加超时并拒绝

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

我正在将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, 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