2 votes

Pourquoi XMLHttpRequest envoie-t-il uniquement "connexion serveur établie" dans l'attribut readyState?

Je essaie de stocker le résultat du service web JSON dans une vue Liste.

Je crée ma requête en javascript mais la valeur de readyState est toujours 1 et ne change jamais. Je ne comprends pas ce qui ne va pas.

Ceci est ma sortie:

État prêt a changé à : 1

   import QtQuick 2.0
import Ubuntu.Components 1.1
import Ubuntu.Components.ListItems 0.1 as ListItem
/*!
    \brief MainView avec une étiquette et des éléments de bouton.
*/

MainView {
    // objectName à des fins de test fonctionnel (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName doit correspondre au champ "name" du manifest click
    applicationName: "com.ubuntu.developer.username.gms"

    /*
     Cette propriété permet à l'application de changer d'orientation
     lorsque l'appareil est tourné. Par défaut, c'est false.
    */
    //automaticOrientation: true

    // Supprime l'ancienne barre d'outils et active les nouvelles fonctionnalités du nouvel en-tête.
    useDeprecatedToolbar: false

    width: units.gu(100)
    height: units.gu(75)

    PageStack {
        id: pageStack
        Component.onCompleted: push(page0)

        Page {
            id: page0
            title: i18n.tr("Index")
            visible: false

            Column {
                anchors.fill: parent
                ListItem.Standard {
                    text: i18n.tr("Voir l'historique")
                    onClicked: pageStack.push(page1)
                    progression: true
                }
                ListItem.Standard {
                    text: i18n.tr("Page externe")
                    onClicked: pageStack.push(Qt.resolvedUrl("MyCustomPage.qml"))
                    progression: true
                }
            }
        }
        Page {
            title: "Rectangle"
            id: page1
            visible: false

            Rectangle {
                width: 320
                height: 480
                ListView {
                    id: view
                    anchors.fill: parent
                    delegate: Text {
                        anchors.fill: parent
                        width: view.width
                        Text { text: "titre: " + modelData.title }
                        Text { text: "sourceIcone: " + modelData.media.m }
                    }
                    function request() {
                        var xhr = new XMLHttpRequest();
                        xhr.onreadystatechange = function() {
                            console.log("État prêt a changé à : " + xhr.readyState +" \n");
                            if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
                                console.log('HEADERS_RECEIVED')
                            } else if(xhr.readyState === XMLHttpRequest.DONE) {
                                console.log('DONE')
                                var json = JSON.parse(xhr.responseText.toString())
                                view.model = json.items
                            }
                        }
                        xhr.open("GET", "http://api.flickr.com/services/feeds/photos_public.gne?format=json&nojsoncallback=1&tags=munich");
                        xhr.send();
                    }
                    Component.onCompleted: {
                        request();
                    }
                } // listView
            } // rectangle
        } // page
    }

}

Normalement je devrais entrer plusieurs fois dans la fonction onreadystatechange...

PS : J'ai ajouté l'autorisation "networking" dans app.apparmor

{
    "policy_groups": [
        "networking"
    ],
    "policy_version": 1.2
}

1voto

Magsol Points 1431

Essayez de changer la ligne suivante :

xhr.open("GET", "http://api.flickr.com/services/feeds/photos_public.gne?format=json&nojsoncallback=1&tags=munich");

...pour :

xhr.open("GET", "http://api.flickr.com/services/feeds/photos_public.gne?format=json&nojsoncallback=1&tags=munich", true);

Remarquez l'argument true donné au paramètre async. Il y a de fortes chances que la nature synchrone de votre appel provoque des problèmes majeurs.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X