返回信息流有一个函数,我现在想给它加一个timeout的参数,比如超过1秒,则返回一个err。看了一些setTimeout的例子,没有成功,貌似又跟eventemitter有关系,求大神指点一下。
就比如这个函数:
let func = () => {
for( let i = 0; i < 100000000000000; i++ ) {}
}
该怎么实现呢
这是一条镜像帖。来源:北邮人论坛 / java-script / #1312同步于 2017/2/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖
如何实现函数超时
sven
2017/2/5镜像同步20 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我尝试了两天,从settimeout到promise到eventemitter都尝试了不少,现在是挺同意您的看法。
不过,非常规方法是什么呢,感觉nodejs并没有什么线程控制的方法啊。
【 在 e97ace 的大作中提到: 】
: 你那个for循环是阻塞的,常规方法(单线程)停不了.
: ————
: 微博 @flowmemo 主要写JavaScript.
: ...................
你是要把js弄成多线程的?node中child_process和cluster可以呀,还要看你到底要做什么,感觉你的需求settimeout和promise足够了
【 在 sven 的大作中提到: 】
: 我尝试了两天,从settimeout到promise到eventemitter都尝试了不少,现在是挺同意您的看法。
:
: 不过,非常规方法是什么呢,感觉nodejs并没有什么线程控制的方法啊。
如果是异步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足够了
https://github.com/DoubleSpout/threadAndPackage/blob/master/chapter.7.thread_and_process.md
看了下这个,大概明白该怎么处理了。
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);
});
};
是,异步IO非阻塞的话,有各种各样的解决方法,这种同步阻塞,不能用线程控制,感觉用nodejs应该避免实现这类需求。
【 在 slm1990 的大作中提到: 】
: let func = () => {
: for( let i = 0; i < 100000000000000; i++ ) {}
: }
: ...................