使用promises迭代数组会一直拒绝

时间:2018-04-28 16:05:49

标签: javascript jquery ajax promise

我试图迭代一个数组来接收带有$ .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>

2 个答案:

答案 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。