BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java-script / #1312同步于 2017/2/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖

如何实现函数超时

sven
2017/2/5镜像同步20 回复
有一个函数,我现在想给它加一个timeout的参数,比如超过1秒,则返回一个err。看了一些setTimeout的例子,没有成功,貌似又跟eventemitter有关系,求大神指点一下。 就比如这个函数: let func = () => { for( let i = 0; i < 100000000000000; i++ ) {} } 该怎么实现呢
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
logsin机器人#1 · 2017/2/5
你需要promise来实现,jquery的promise一秒钟之后promise.reject()
e97ace机器人#2 · 2017/2/6
你那个for循环是阻塞的,常规方法(单线程)停不了. ———— 微博 @flowmemo 主要写JavaScript. 此签名通过「北邮人签名档」脚本发送
sven机器人#3 · 2017/2/6
我尝试了两天,从settimeout到promise到eventemitter都尝试了不少,现在是挺同意您的看法。 不过,非常规方法是什么呢,感觉nodejs并没有什么线程控制的方法啊。 【 在 e97ace 的大作中提到: 】 : 你那个for循环是阻塞的,常规方法(单线程)停不了. : ———— : 微博 @flowmemo 主要写JavaScript. : ...................
logsin机器人#4 · 2017/2/6
你是要把js弄成多线程的?node中child_process和cluster可以呀,还要看你到底要做什么,感觉你的需求settimeout和promise足够了 【 在 sven 的大作中提到: 】 : 我尝试了两天,从settimeout到promise到eventemitter都尝试了不少,现在是挺同意您的看法。 : : 不过,非常规方法是什么呢,感觉nodejs并没有什么线程控制的方法啊。
sven机器人#5 · 2017/2/6
如果是异步IO这类的,比如fs的操作,用bluebird的timeout就搞定了,某些需求race也可以。 但是这个for循环是个同步阻塞,如果用c直接用pthread_cond_timedwait搞个线程监控就行了。 child_process和cluster是单独起进程了吧,那就是fork一个进程,执行某个函数,然后超时就kill嘛?感觉这样的操作有点杀鸡用牛刀。现在再想想nodejs不适合密集计算,觉得我这个需求好像就是不该用nodejs写似的。 如果你有解决方法,能贡献一下代码,让我学习一下吗~ 【 在 logsin 的大作中提到: 】 : 你是要把js弄成多线程的?node中child_process和cluster可以呀,还要看你到底要做什么,感觉你的需求settimeout和promise足够了
sven机器人#6 · 2017/2/6
https://github.com/DoubleSpout/threadAndPackage/blob/master/chapter.7.thread_and_process.md 看了下这个,大概明白该怎么处理了。
slm1990机器人#7 · 2017/2/6
let func = () => { for( let i = 0; i < 100000000000000; i++ ) {} } 这是同步代码,除非在for里面加判断,不像java实现个runnable接口跑多线程。单核能做的就那么多。楼主这个需求在前端多出现在网络请求IO上,参考下xhr的timeout实现吧。 'use strict'; /** * [description] * @param {[Object]} request [请求对象] * @param {Function} next [回调] * @return {[null]} */ const action = (request, next) => { let timeout; // request.timeout 改成 1000 if (request.timeout) { timeout = setTimeout(() => { request.cancel(); // => console.log('error') }, request.timeout); } next((response) => { clearTimeout(timeout); }); };
sven机器人#8 · 2017/2/6
是,异步IO非阻塞的话,有各种各样的解决方法,这种同步阻塞,不能用线程控制,感觉用nodejs应该避免实现这类需求。 【 在 slm1990 的大作中提到: 】 : let func = () => { : for( let i = 0; i < 100000000000000; i++ ) {} : } : ...................
inaadversity机器人#9 · 2017/2/6
这一点还是golang方便