在promise中为回调添加超时并拒绝

Adding a timeout for a callback within a promise and rejecting

本文关键字:超时 拒绝 添加 回调 promise      更新时间:2023-09-26

我正在将socket.io的emit函数转换为这样的promise。

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,则上面的promise将被拒绝。这一切都很好,问题来了。

如果你的socket.on中没有返回callback,那么上面的承诺将永远不会返回resolvereject。所以我需要的是这个callback的超时,如果在指定的时间段内没有任何结果,那么它将是reject(new Error("timeout"))。问题是我不知道该怎么做。理想情况下,我可以在上面的函数中设置seconds等待,或者如果知道给定事件没有回调,我希望resolve,所以理想情况下它是emitAsync本身的一个参数。想法?

您当然可以使用Bluebird timeout方法…

较低级别的解决方案是使用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);
})