我正在使用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;
};
如果我控制台.log状态我一直保持良好的状态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日志显示获取数据所需的所有网址。 然后,正在执行回调。
导致:
获取文件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
答案 0 :(得分:1)
我弄清楚问题是什么。 我同时做了很多事情,将数据保存在内存中,同时将数据传递给其他函数。换句话说,我只是内存不足。我要重构代码。
答案 1 :(得分:0)
你的语法没有意义。你能澄清一下这里发生了什么吗?
return getFile(url)(function (ajaxResult) {
return {
movieTitle:movieTitle,
filename: file,
movieScraperInfo: ajaxResult
};
});