перебор массива с обещаниями продолжает отклонять - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь перебрать массив для получения данных с помощью $ .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'));

}

Я пытался решить эту проблему уже несколько дней и, конечно, я искал в Интернете, но не мог найти решение, я продолжаю получать:

GET http://192.168.10.11:3000/html 404 (не найдено)

и

Uncaught (в обещании) {readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ,…}

я хочу только массив, заполненный данными, поступающими из:

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

но индекс должен совпадать с индексом тестирования, поэтому при тестировании первый элемент 123.html Первый элемент массива данных должен быть заполнен данными 123.html, а не заполняться, например, данными 345.html. ценим любую помощь

редактировать ответ от обещания

"Cannot 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 для Android и 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 /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 голосов
/ 29 апреля 2018

Ваша проблема не связана с обещаниями. Проблема в аргументе, который вы передаете $.get: он всегда вычисляется в один аргумент со значением "html" из-за оператора запятой, который вы (неосознанно?) Используете:

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

Оператор запятой возвращает значение последнего элемента в кортеже. Вы, вероятно, не собирались использовать этот оператор, но просто хотели передать 3 аргумента $.get вместо одного. Поэтому удалите одну пару скобок, чтобы запятая больше не действовала как оператор, а как разделитель аргументов функции:

URL + '/surveys/' + fileName, { "_": $.now() },'html'
0 голосов
/ 28 апреля 2018

Может быть, следующее поможет вам определить, какие значения являются ошибочными, какие ошибки и какие успешны:

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, если вам нужно поддерживать браузеры, у которых нет собственных обещаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...