我试图迭代一个数组来接收带有$ .get的数据,但我一直得到拒绝,首先我得到了应该接收数据的路径:
function getFiles() {
return $.get(URL + "/getdata.php");
}
var testing= await getFiles();
testing=$.parseJSON(testing);
返回:
["12487.html", "46962.html"]
这很好,但现在我试图像这样迭代:
var surveyData=[];
for(var i=0;i<testing.length;i++){
console.log('in loop '+i)
surveyData.push(getHtml(testing[i]));
}
$.when(surveyData).done((...data)=>{
console.log(data);
}).fail((e)=>{console.log('failed:'+e)})
async function getHtml(fileName){
return await $.get((URL + '/surveys/' + fileName, { "_": $.now() },'html'));
}
我一直试图解决这个问题好几天,当然我在网上搜索但是找不到解决办法,我一直在努力:
获取http://192.168.10.11:3000/html 404(未找到)
和
未捕获(承诺){readyState:4,getResponseHeader:ƒ, getAllResponseHeaders:ƒ,setRequestHeader:ƒ,overrideMimeType:ƒ,...}
我想要的只是一个数组填充来自的数据:
$.get((URL + '/surveys/' + fileName, { "_": $.now() },'html'));
但索引必须与测试索引相同,因此在测试第一项时是 123.html数据数组第一项必须填充123.html的数据,而不是填写345.html的数据。 感谢任何帮助
修改 承诺的回应是
“不能GET /html↵”
我已经让它在没有承诺的情况下工作但导致错误索引的数据
$.ajax({
url: URL + "/getdata.php",
cache: false,
success: function (data) {
serverfiles = $.parseJSON(data);
if (serverfiles.length) {
$.each(serverfiles, function (i, val) {
$.get(URL + '/surveys/' + val, { "_": $.now() }, function (html) {
//do something with html
}, 'html');
});
}
},
error: function (e) {
console.log(e);
},
fail: function (e) {
console.log('fail');
console.log(e);
}
});
我正在使用Jquery 1.12.4和Cordova for Android&amp; IOS
更新
使用HMR的代码我得到:
failed items:
failed: 12487.html error:
Object { readyState: 4, getResponseHeader: getResponseHeader(), getAllResponseHeaders: getAllResponseHeaders(), setRequestHeader: setRequestHeader(), overrideMimeType: overrideMimeType(), statusCode: statusCode(), abort: abort(), state: state(), always: always(), then: then(), … }
failed: 46962.html error:
Object { readyState: 4, getResponseHeader: getResponseHeader(), getAllResponseHeaders: getAllResponseHeaders(), setRequestHeader: setRequestHeader(), overrideMimeType: overrideMimeType(), statusCode: statusCode(), abort: abort(), state: state(), always: always(), then: then(), … }
successes:
Array []
以下:
abort: function abort()
always: function always()
complete: function add()
done: function add()
error: function add()
fail: function add()
getAllResponseHeaders: function getAllResponseHeaders()
getResponseHeader: function getResponseHeader()
overrideMimeType: function overrideMimeType()
pipe: function then()
progress: function add()
promise: function promise()
readyState: 4
responseText: "Cannot GET /html\n"
setRequestHeader: function setRequestHeader()
state: function state()
status: 404
statusCode: function statusCode()
statusText: "Not Found"
success: function add()
then: function then()
__proto__: Object { … }
html数据示例:
<!DOCTYPE html><html><meta charset="UTF-8"><meta name="viewport"
content="user-scalable=no, initial-scale=1, maximum-scale=1,
minimum-scale=1, width=device-width"><head><title>Umfrage</title><link
rel="stylesheet" href="http://mysite.de/s/css/Theme.css" /><link
rel="stylesheet"
href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css"
/><script
src="http://code.jquery.com/jquery-1.11.1.min.js"></script><script
src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script><script
src="http://mysite.de/s/main.js"></script><noscript>JavaScript ist
nicht aktiviert, bitte Aktivieren!</noscript></head><body><div
data-role="page" id="survey" data-theme="a"><div data-role="header"
data-position="fixed"><h2 id="title" style="text-align:center;">my
title</h2></div><form action="" method="post" id="form"><hr
id="hrid"><input type="submit" value="Abschicken" id="submit"><input
type="hidden" value="my title" name="titlename"
/></form></div></body></html>
答案 0 :(得分:2)
您的问题与承诺无关。问题在于你传递给$.get
的论点:它总是用值&#34; html&#34;来计算一个参数。因为您(无意识地?)使用的逗号运算符:
(URL + '/surveys/' + fileName, { "_": $.now() },'html')
逗号运算符返回元组中最后一个元素的值。您可能不打算使用该运算符,但只想将3个参数传递给$.get
而不是1。因此,删除一对括号,使逗号不再作为运算符,而是作为函数参数分隔符:
URL + '/surveys/' + fileName, { "_": $.now() },'html'
答案 1 :(得分:0)
也许以下内容可以帮助您找出哪些值失败,哪些错误以及哪些内容成功:
function Fail(reason){this.reason=reason;};
const isFail = o=>(o&&o.constructor)===Fail;
const isNotFail = o=>!isFail(o);
Promise.all(
testing.map(
t=>getHtml(t).catch(err=>new Fail([err,t]))
)
).then(//this will not result in rejected promises because catch will return fail object
results=>{
console.log("failed items:");
results.filter(isFail).forEach(
fail=>console.log("failed:",fail.reason[1],"error:",fail.reason[0])
);
console.log(
"successes:",
results.filter(isNotFail)
);
}
)
也;如果你想在数组中使用$ .when,你应该这样使用它:
$.when.apply($,surveyData)
但是根据你使用延迟对象的jQuery版本行为很糟糕(在版本2之后它可能没问题,但我不确定)。如果您需要支持没有本机承诺的浏览器,最好使用体面的Promise polyfill。