小编Ern*_*lli的帖子

如何修复jslint错误'不要在循环中创建函数'.

我正在努力使我们所有的JS代码都通过jslint传递,有时需要进行大量的调整以获得遗留代码的选项,以便稍后正确修复它.

jslint有一件事抱怨我没有工作.那就是当使用这样的结构时,我们得到错误'不要在循环中创建函数'.

for (prop in newObject) {
    // Check if we're overwriting an existing function
    if (typeof newObject[prop] === "function" && typeof _super[prop] === "function" &&
        fnTest.test(newObject[prop])) {
        prototype[prop] = (function(name, func) {
            return function() {
                var result, old_super;

                old_super = this._super;
                this._super = _super[name];
                result = func.apply(this, arguments);
                this._super = old_super;

                return result;
            };
        })(prop, newObject[prop]);
    }
}
Run Code Online (Sandbox Code Playgroud)

此循环是经典继承的JS实现的一部分,其中扩展现有类的类在调用扩展类的成员时保留扩展类的超级属性.只是为了澄清,上面的实现受到了John Resig的博客文章的启发.

但是我们还在循环中创建了其他函数实例.

到目前为止,唯一的解决方法是从jslint中排除这些JS文件,但我们希望使用jslint进行代码验证和语法检查,作为我们持续集成和构建工作流程的一部分.

有没有更好的方法来实现这样的功能或有没有办法通过jslint调整这样的代码?

javascript jslint

60
推荐指数
5
解决办法
3万
查看次数

为什么假设send可能返回的数据少于在阻塞套接字上传输的请求数据?

在流套接字上发送数据的标准方法一直是调用send和一大块数据来写,检查返回值以查看是否所有数据都已发送,然后再次调用send直到整个消息被接受为止.

例如,这是一个常见方案的简单示例:

int send_all(int sock, unsigned char *buffer, int len) {
  int nsent;

  while(len > 0) {
    nsent = send(sock, buffer, len, 0);
    if(nsent == -1) // error
      return -1;

    buffer += nsent;
    len -= nsent;
  }
  return 0; // ok, all data sent
}

甚至BSD手册也提到了这一点

...如果套接字上没有可用的消息空间来保存要传输的消息,则send()通常会阻塞 ...

这表明我们应该假设send可以在不发送所有数据的情况下返回.现在我发现这个相当破碎,但即使是W. Richard Stevens在他的标准参考书中假定这是关于网络编程的,而不是在开头的章节中,但更高级的例子使用他自己的写(写所有数据)函数而不是调用write.

现在我认为这仍然或多或少被破坏,因为如果send无法传输所有数据或接受底层缓冲区中的数据并且套接字阻塞,则send应该阻塞并在整个发送请求被接受时返回.

我的意思是,在上面的代码示例中,如果send返回的数据发送的数量较少,那么将使用新请求再次调用它.自上次通话以来有什么变化?最多几百个CPU周期已经过去,因此缓冲区仍然是满的.如果发送现在接受数据,为什么它不能接受它?

否则我们将以低效循环结束upp,我们试图在无法接受数据并继续尝试的套接字上发送数据,否则?

因此,如果需要,似乎解决方法会导致代码效率极低,并且在这些情况下应该避免阻塞套接字,而应该使用非阻塞套接字和select.

c sockets coding-style send

20
推荐指数
1
解决办法
5801
查看次数

当可能必须删除模块以节省内存时,是否可以使用requirejs

我们在嵌入式环境中开发应用程序.它是一个高级计算环境,在busybox Linux系统之上有一个完整的Web浏览器.唯一的例外是系统具有有限的系统内存.

我们的应用程序是用JavaScript构建的,并在基于Webkit的webbrowser中运行,并且包含许多按顺序加载的javascript模块(效率不高).

某些模块提供了多个模块使用的通用功能.我们正在使用requirejs转换当前的javascript加载器,但我们必须先解决一个特定的需求.

使用requirejs加载模块时是否可以卸载模块?假设我们使用以下方法动态加载模块:

require(["somemodule.js"], function(m) { m.run(); } );
Run Code Online (Sandbox Code Playgroud)

这适用于加载和运行'somemodule'并且还解决'somemodule'的所有依赖关系,而requirejs框架将存储对'somemodule'的引用以用于将来的请求.

如果我们在某些时候需要回收内存,例如能够加载和运行无限数量的模块,我们必须在一段时间后开始删除其中的一些.这是否可以使用requirejs而不改变内部实现?

有没有人以前处理过这类问题?大多数单页JS应用程序在台式PC上的Web浏览器中运行,其中内存使用通常不是主要问题.

javascript memory-management module requirejs

16
推荐指数
1
解决办法
7674
查看次数

为什么Ant taskdef无法加载./net之外的资源

当使用taskdef声明外部ant任务时,例如ant-contrib,建议的设置是使用followin taskdef:

<taskdef resource="net/sf/antcontrib/antcontrib.properties">
  <classpath>
    <pathelement location="lib/ant-contrib/ant-contrib-1.0b3.jar"/>
  </classpath>
</taskdef>
Run Code Online (Sandbox Code Playgroud)

当antcontrib.properties位于net/sf/antcontrib相对于build.xml文件时,这种方法有效.

但是当我把它放在lib/net/sf/antcontrib中并将taskdef更改为

<taskdef resource="lib/net/sf/antcontrib/antcontrib.properties">
  <classpath>
    <pathelement location="lib/ant-contrib/ant-contrib-1.0b3.jar"/>
  </classpath>
</taskdef>
Run Code Online (Sandbox Code Playgroud)

Ant无法找到属性文件,它会给出错误

[taskdef] Could not load definitions from resource
lib/net/sf/antcontrib/antcontrib.properties. It could not be found.
Run Code Online (Sandbox Code Playgroud)

似乎ant分别处理lib目录并且无法从那里加载taskdef资源.

ant taskdef

11
推荐指数
1
解决办法
4万
查看次数

问题在servlet中读取请求体

我正在编写一个HTTP代理,它是测试/验证系统的一部分.代理过滤来自客户端设备的所有请求,并将它们引导到各种受测试的系统.

代理实现为servlet,每个请求都转发到目标系统,它处理GET和POST.有时,目标系统的响应会被改变以适应各种测试条件,但这不是问题的一部分.

转发请求时,将复制所有标头,但实际HTTP传输的标头除外,例如Content-Length和Connection标头.

如果请求是HTTP POST,那么请求的实体主体也会被转发,这里有时它不起作用.

从servlet请求中读取实体主体的代码如下:

URL url = new URL(targetURL);
HttpURLConnection conn  = (HttpURLConnection)url.openConnection();
String method = request.getMethod();

java.util.Enumeration headers = request.getHeaderNames();
while(headers.hasMoreElements()) {

    String headerName = (String)headers.nextElement();
    String headerValue = request.getHeader(headerName);

    if (...) { // do various adaptive stuff based on header 

    }

    conn.setRequestProperty(headerName, headerValue);
}
Run Code Online (Sandbox Code Playgroud)

//这里是失败的部分

char postBody[] = new char[1024];
int len;

if(method.equals("POST")) {
    logger.debug("guiProxy, handle post, read request body");
    conn.setDoOutput(true);

    BufferedReader br = request.getReader();
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));

    do {
        logger.debug("Read request into …
Run Code Online (Sandbox Code Playgroud)

java post servlets http tomcat6

2
推荐指数
1
解决办法
9062
查看次数