在promise中为回调添加超时并拒绝
Adding a timeout for a callback within a promise and rejecting
我正在将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
,那么上面的承诺将永远不会返回resolve
或reject
。所以我需要的是这个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);
})
相关文章:
- 在流星上使用微信js-sdk时出现拒绝权限错误
- 在Nodejs中Express输入DEBUG=app时权限被拒绝/bin
- 使用优化器在慢速连接上加载main.js时需要js超时
- 简单的ES6承诺问题-交换解决和拒绝参数
- javascript第三个XMLHttpRequest被拒绝.但前两个是允许的
- 当浏览器控制台未打开时,为什么要求会导致Internet Explorer 9超时
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- 超时功能的性能
- 使用不同的超时对数组中的每个项目进行角度动画处理
- 设置第一次执行的超时
- Facebook FB.init”;访问被拒绝”;在Internet Explorer 11中
- node.js测试事件是否是在不使用超时的情况下使用sinon.js发出的
- 未处理的拒绝MongoError:无法连接到MongoDB中的服务器
- 使用javascript和随机暂停/超时快速循环文本
- Node.js solrProxy访问被拒绝
- 在promise中为回调添加超时并拒绝
- 链接超时会导致最后一次超时被拒绝
- 重复一个Promise,直到它没有被拒绝或超时为止
- 未处理的拒绝错误:超时:没有加载此页面上的所有资源
- 如果未授予/拒绝访问,则会超时