0

我正在使用 XHR nodejs 模块进行大量 ajax 调用(现在大约 100 个)。我使用延迟执行此异步操作。这非常有效,直到请求数量通过大约 40 到 50 个调用。然后它只是停止并且无法定义地什么都不做。如果我同步进行(这不是一个真正的选择),它确实支持我可以通过它进行的所有调用。那么是什么导致了这个问题呢?

我的代码如下:

    function getFile(url) {
        var def = deferred()
        ,xhr = new XMLHttpRequest(); 

        xhr.open("GET", url); 
        xhr.onreadystatechange = handler;
        //Callback
        function handler (){
            // If status is ready
            if (this.readyState == 4 && this.status >= 200 && this.status < 300 || this.status === 304) {
                try {
                    var result = eval(this.responseText);
                } catch (e) {
                    def.resolve(e);
                }
                def.resolve(result && result[0]);
            } else if (this.status === 401){
                console.log('Error 401')
                def.resolve(new Error('Error:' + this.responseText));
            };
        };
        xhr.send(null);
        return def.promise;
    };

如果我控制台记录状态,我会不断获得一个不错的状态 200。

我正在使用以下代码片段调用 getfile():

var express = require('express')
, app = express()
, fs = require('fs')
, XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest
, promisify = require('deferred').promisify
, deferred = require('deferred')
, readdir = promisify(fs.readdir)
, exists = promisify(fs.exists)
, writeFile = promisify(fs.writeFile)
, filepath = './public/movies/config/moviefiles.js'

    // Set max of events to unlimited
    req.setMaxListeners(0)
    readdir(configfileResults.moviepath).map(function (file) {
        var filename = file
        , year = longregex
        , movietitle = verylongregex
        if (year == null) year = ''
        var url = "http://api.themoviedb.org/2.1/Movie.search/"+configfileResults.language+"/json/apikey/"+movieTitle+"?year="+ year +"?="
        return getFile(url)(function (ajaxResult) {
            return {
                movieTitle:movieTitle,
                filename: file,
                movieScraperInfo: ajaxResult
            };
        });
    })(function (data) {
       return writeFile(filepath, JSON.stringify(data, null, 4));
    }).end(function () {
        // Download Cache
        downloadCache()
    }, function (e) {
        console.log("Failed", e);
    });

非常感谢!

编辑:

正如布拉德建议的那样,我添加了很多控制台日志。

function getFile(url) {
    var def = deferred()
    ,xhr = new XMLHttpRequest(); 
    console.log("url:", url);
        xhr.onreadystatechange = function() {
            console.log("status ready");
            if (this.readyState == 4 && this.status >= 200 && this.status < 300 || this.status === 304) {
                try {
                    var result = eval(this.responseText);
                    console.log('getting files', i++)
                } catch (e) {
                    def.resolve(e);
                }
                console.log("resolving files");
                def.resolve(result && result[0]);
            } else if (this.status === 401){
                console.log('Error 401')
                def.resolve(new Error('Error:' + this.responseText));
            };
            console.log("not ready");
        };
        console.log("out of callback");
    xhr.open("GET", url); 
    xhr.send(null);
    return def.promise;
};

结果:

我得到 60 个“url:”,显示获取数据所需的所有 url 的 url 日志。然后,正在执行回调。

导致:

获取文件 3 解析文件未就绪状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪 获取文件 4 解析文件 未就绪 状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪 获取 文件 5 解析 文件 未就绪 状态 就绪 未就绪 状态 就绪 未就绪 状态准备好获取文件 6 解决文件未准备好状态 准备好未准备好状态 准备好未准备好状态 准备好获取文件 7 解决文件未准备好状态 准备好未准备好状态 准备好未准备好状态 准备好获取文件 8 解决文件未准备好状态 准备好未准备好状态 准备好未准备好状态准备好获取文件 9 解决文件未准备好 状态准备好未准备好 状态准备好未准备好 状态准备好获取文件 10 解决文件未准备好 状态准备好 未准备好 状态准备好 未准备好 状态准备好获取文件 11 解决文件未准备好 状态就绪未就绪状态就绪未就绪状态就绪获取文件12 解析文件未就绪状态就绪未就绪状态就绪未就绪状态就绪获取文件13 解析文件未就绪状态就绪未就绪状态就绪未就绪状态就绪获取文件14 解析文件未就绪状态就绪未就绪状态就绪状态未就绪状态就绪获取文件15 解析文件未就绪状态就绪未就绪状态就绪状态未就绪状态就绪获取文件16 解析文件未就绪状态就绪状态未就绪状态就绪未就绪状态就绪状态获取文件17 解析文件未就绪就绪状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪 获取文件 18 解析文件 未就绪 状态 就绪 未就绪 状态 就绪 未 就绪 状态 就绪 获取 文件 19 解析 文件 未 就绪 状态 就绪 未 就绪 状态 就绪 未准备好状态 准备好获取文件 20 解析文件未准备好 状态准备好 未准备好 状态准备好 未准备好 状态准备好 获取文件 21 解析文件未准备好 状态准备 未准备好 状态准备好 未准备好 状态准备好 获取文件 22 解决文件未准备好 状态准备好 未准备好 状态准备好未准备好状态 准备好获取文件 23 解决文件未准备好状态 准备好未准备好状态 准备好未准备好状态 准备好获取文件 24 解决文件未准备好状态 准备好未准备好状态 准备好未准备好状态 准备好获取文件 25 解决文件未准备好状态 准备好未准备好状态准备好 未准备好 状态 准备好获取文件 26 解析文件 未准备好 状态 准备好 未准备好 状态 准备好 未准备好 状态 准备好获取文件 27 解决文件 未准备好 状态 准备好 未准备好 状态准备好 未准备好 状态准备 获取文件28 解析文件未就绪状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪 获取文件 29 解析文件 未就绪 状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪 获取 文件 30 解析 文件 未就绪 状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪 获取文件 31 解析文件未就绪状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪 获取文件 32 解析文件 未就绪 状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪 获取文件 33 解析文件 未就绪 状态 就绪 未就绪 状态 就绪 未就绪 状态 就绪获取文件 34 解析文件未就绪状态 就绪未就绪状态 就绪未就绪状态 获取文件 35 解析文件未就绪状态 就绪未就绪状态 就绪未就绪状态 就绪获取文件 36 解析文件未就绪状态就绪未就绪状态就绪未就绪状态就绪获取文件37 解析文件未就绪状态就绪未就绪状态就绪未就绪状态就绪获取文件38 解析文件未就绪状态就绪未就绪状态就绪未就绪状态就绪获取文件39 解析文件未就绪状态就绪 未就绪 状态就绪 未就绪 状态就绪 获取文件 40 解析文件未就绪

以 de 'not ready' 结尾。

任何人都可以对此有所了解吗?见github上的代码:

https://github.com/jansmolders86/mediacenterjs/blob/master/apps/movies/index.js

4

2 回答 2

1

我弄清楚了问题所在。我同时做了很多事情,将数据保存在内存中,同时将其传递给其他函数。换句话说,我只是内存不足。我要重构代码。

于 2013-03-29T15:59:40.107 回答
0

你的语法没有意义。你能澄清一下这里发生了什么吗?

return getFile(url)(function (ajaxResult) {
        return {
            movieTitle:movieTitle,
            filename: file,
            movieScraperInfo: ajaxResult
        };
    });
于 2013-03-19T17:24:51.010 回答