Javascript XMLHttpRequest.send返回未定义的
大家好,我的问题是Javascript XMLHttpRequest.send返回未定义的,javascript,Javascript,大家好,我的问题是upload()每次返回undefined,但我希望返回true或false。请纠正我!教我哪里做错了。uploadToS3是我在S3上调用的另一个上传图像的函数 if(upload("fileFieldId","hiddenTextFieldId","docType","uploadId")){ alert("success"); } else{ alert("upload fail"); } function upload(fileFieldId,hidd
upload()
每次返回undefined
,但我希望返回true或false。请纠正我!教我哪里做错了。uploadToS3是我在S3上调用的另一个上传图像的函数
if(upload("fileFieldId","hiddenTextFieldId","docType","uploadId")){
alert("success");
}
else{
alert("upload fail");
}
function upload(fileFieldId,hiddenTextFieldId,docType,uploadId){
document.getElementById(uploadId).innerHTML = "<b>Uploading ...</b>";
var dt= new Date();
var file = document.getElementById(fileFieldId).files[0];
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari Tue, 07 Jun 2016 14:40:00 GMT
xmlhttp=new XMLHttpRequest();
}
else{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
// alert(file.name);
xmlhttp.open("POST", "/sellerprofile/uploadajax/");
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
var result = JSON.parse(xmlhttp.responseText);
let headers = {
'Accept': '*/*',
'Content-Type': file.type, // or where ever your file object is.
'Authorization': result.signature, // which you receive from your server
'x-amz-acl' : 'private', // required
'x-amz-date' : dt.toUTCString() // required
}
let putURL = result.url;
let nm = result.fileName;
// alert(result.fileName);
let uploader = uploadToS3(putURL, headers, file)
uploader.upload()
.then((result) => {
document.getElementById(hiddenTextFieldId).value = nm;
document.getElementById(uploadId).innerHTML = "<b>File Uploaded</b>";
document.getElementById(uploadId).style.color = "green";
document.getElementById(fileFieldId).value = "";
document.getElementById(fileFieldId).required = false;
return true;
})
.catch((err) => {
document.getElementById(uploadId).innerHTML = "<b>Uploading failed....</b>";
document.getElementById(uploadId).style.color = "red";
return false;
})
}
else{
return false;
}
}
var data = {"type": file.type , "time": dt.toUTCString(), "extention" : (file.name).split('.').pop(),"docType": docType}
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(data));
}
if(上传(“fileFieldId”、“hiddenTextFieldId”、“docType”、“uploadId”)){
警惕(“成功”);
}
否则{
警报(“上传失败”);
}
函数上载(fileFieldId、HiddenExtFieldId、docType、uploadId){
document.getElementById(uploadId).innerHTML=“上传…”;
var dt=新日期();
var file=document.getElementById(fileFieldId).files[0];
如果(window.XMLHttpRequest){//IE7+代码,Firefox,Chrome,Opera,Safari周二,2016年6月7日14:40:00 GMT
xmlhttp=新的XMLHttpRequest();
}
else{//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
//警报(文件名);
open(“POST”,“/sellerprofile/uploadajax/”;
xmlhttp.onreadystatechange=函数(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
var result=JSON.parse(xmlhttp.responseText);
让标题={
“接受”:“*/*”,
“内容类型”:file.Type,//或文件对象所在的位置。
“授权”:result.signature,//从服务器接收
'x-amz-acl':'private',//必需
“x-amz-date”:dt.toutString()//必需
}
让putURL=result.url;
设nm=result.fileName;
//警报(result.fileName);
let uploader=uploadToS3(putURL、头、文件)
uploader.upload()
。然后((结果)=>{
document.getElementById(hiddenTextFieldId).value=nm;
document.getElementById(uploadId).innerHTML=“File upload”;
document.getElementById(uploadId).style.color=“绿色”;
document.getElementById(fileFieldId).value=“”;
document.getElementById(fileFieldId).required=false;
返回true;
})
.catch((错误)=>{
document.getElementById(uploadId).innerHTML=“上传失败…”;
document.getElementById(uploadId).style.color=“红色”;
返回false;
})
}
否则{
返回false;
}
}
var data={“type”:file.type,“time”:dt.toutString(),“extention”:(file.name).split('.').pop(),“docType”:docType}
setRequestHeader(“内容类型”、“应用程序/json”);
send(JSON.stringify(data));
}
您正在进行一个异步的AJAX请求调用,在默认流中,您的函数将不返回任何内容。每个return语句都位于onreadystatechange()方法中。因此,如果调用方法,它将发出AJAX请求并立即退出,返回“undefined”,因为这里没有return语句:
var data = {"type": file.type , "time": dt.toUTCString(), "extention" : (file.name).split('.').pop(),"docType": docType}
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(data));
您可以返回类似于标志值的值,以确定调用是否已成功发送到服务器,如下所示:
return 'CALL_SENT';
并检查返回的值,如下所示:
var valReturned = upload("fileFieldId","hiddenTextFieldId","docType","uploadId");
if(valReturned === 'CALL_SENT'){
alert("Call sent to the server");
}
else if(valReturned === true){
alert("succcess");
}
else{
alert("upload fail");
}
希望这有帮助。您应该使用回调或承诺来实现这一点。我更喜欢回调解决方案
upload("fileFieldId", "hiddenTextFieldId", "docType", "uploadId", function (status) {
if (status) {
alert("success");
}
else{
alert("upload fail");
}
});
然后upload函数应支持最后一个参数作为回调:
function upload(fileFieldId,hiddenTextFieldId,docType,uploadId, callback) {
......
uploader.upload()
.then((result) => {
document.getElementById(hiddenTextFieldId).value = nm;
document.getElementById(uploadId).innerHTML = "<b>File Uploaded</b>";
document.getElementById(uploadId).style.color = "green";
document.getElementById(fileFieldId).value = "";
document.getElementById(fileFieldId).required = false;
callback(true);
})
.catch((err) => {
document.getElementById(uploadId).innerHTML = "<b>Uploading failed....</b>";
document.getElementById(uploadId).style.color = "red";
callback(false);
})
......
}
函数上载(fileFieldId、hiddenTextFieldId、docType、uploadId、回调){
......
uploader.upload()
。然后((结果)=>{
document.getElementById(hiddenTextFieldId).value=nm;
document.getElementById(uploadId).innerHTML=“File upload”;
document.getElementById(uploadId).style.color=“绿色”;
document.getElementById(fileFieldId).value=“”;
document.getElementById(fileFieldId).required=false;
回调(true);
})
.catch((错误)=>{
document.getElementById(uploadId).innerHTML=“上传失败…”;
document.getElementById(uploadId).style.color=“红色”;
回调(假);
})
......
}