gpt4 book ai didi

javascript - 在 promise 和拒绝中添加回调超时

转载 作者:行者123 更新时间:2023-11-28 19:18:20 24 4
gpt4 key购买 nike

我正在将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 回调不会返回 Node 样式的回调签名。 The first argument can't be an error object.所以计划是传递一个字符串错误消息,如果第一个参数是 true ,上面的 promise 将拒绝。这一切都很好,但问题来了。

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

最佳答案

您可以使用Bluebird timeout method当然……

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

关于javascript - 在 promise 和拒绝中添加回调超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29417485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com