我正在尝试定义一个函数来检查文件是否存在,但该函数总是未定义,即使找到该文件:
var findFile = function(startURL) {
var host = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
var uri = host + startURL + '/file.js';
//console.log(uri);
var http = new XMLHttpRequest();
http.open('GET',uri,true);
http.send();
var processRequest = function (e) {
if (http.status == 200) {
return "found";
} else {
console.log(http.status);
console.log(http.readyState);
return 'not_found';
}
}
http.onreadystatechange = processRequest;
}
运行一个有效的文件(从http得到200结果),我得到一个未定义的结果。
a = findFile('/app');
>undefined
我在回报声明中做错了什么?
修改
我添加了回调函数,但我仍然未定义:
这是我现在的代码:
var findServiceWorkerFile = function(startURL,callback) {
var host = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
var uri = host + startURL + '/RoasSDKWorker.js';
//console.log(uri);
var http = new XMLHttpRequest();
http.open('GET',uri,true);
http.send();
var file_status;
var processRequest = function (e) {
if (http.status == 200) {
file_status = 'found';
callback(file_status);
"found";
} else {
file_status = 'not_found';
callback(file_status);
}
}
http.onreadystatechange = processRequest;
}
function findFileCallBack(value) {
return value;
}
答案 0 :(得分:1)
由于undefined
,函数findFile
已成为异步函数,您将获得XMLHttpRequest()
。
函数调用a = findFile('/app');
将执行网络I / O并立即返回。它不会等待网络请求完成。
您必须使用回调来获取findFile
函数的返回值,这是一个标准的javascript范例。你可以做这样的事情
var findFile = function(startURL, callback) {
var host = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
var uri = host + startURL + '/file.js';
//console.log(uri);
var http = new XMLHttpRequest();
http.open('GET',uri,true);
http.send();
var processRequest = function (e) {
if (http.status == 200) {
callback("found");
} else {
console.log(http.status);
console.log(http.readyState);
callback("not_found");
}
}
http.onreadystatechange = processRequest;
}
function b(ret_val) {
console.log(ret_val);
}
findFile('/app', b);
我还没有对代码进行过测试,但这只是一个暗示你可以如何工作的提示。 代码为here