迭代以诺言为准,不断拒绝



我正在尝试迭代一个数组以接收$ .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的数据。感谢任何帮助

编辑承诺的回应是

"无法获得/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);
        }
    });

我正在使用Cordova使用JQuery 1.12.4进行Android&amp;ios

update

使用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 /htmln"
​
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>

您的问题与承诺无关。问题在于,您将您传递给$.get的参数:它始终以一个值" html"评估一个参数,因为您(不自觉?(使用逗号运算符:

(URL + '/surveys/' + fileName, { "_": $.now() },'html')

逗号操作员返回元组中最后一个元素的值。您可能不打算使用该操作员,而只是想将3个参数传递给$.get而不是一个。因此,请删除一对括号,以使逗号不再充当操作员,而是作为函数参数分离器:

URL + '/surveys/' + fileName, { "_": $.now() },'html'

也许以下内容可以帮助您弄清楚哪些错误和成功的错误是什么值:

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.apply($,surveyData)

,但是根据jQuery的版本,您使用的是延期对象的行为可怕(版本2之后,可能还可以,但我不确定(。如果您需要支持没有本机承诺的浏览器,最好使用一个体面的承诺polyfill。

最新更新