web-dev-qa-db-fra.com

Pourquoi XMLHttpRequest envoie uniquement une "connexion serveur établie" dans l'attribut readyState?

J'essaie de stocker le résultat du service Web JSON dans une vue de liste.

Je crée ma demande en javascript mais ma valeur readyState est toujours 1 et ne change jamais. Je ne comprends pas ce qui ne va pas.

Voici ma sortie:

État prêt changé en: 1

   import QtQuick 2.0
import Ubuntu.Components 1.1
import Ubuntu.Components.ListItems 0.1 as ListItem
/*!
    \brief MainView with a Label and Button elements.
*/

MainView {
    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "com.ubuntu.developer.username.gms"

    /*
     This property enables the application to change orientation
     when the device is rotated. The default is false.
    */
    //automaticOrientation: true

    // Removes the old toolbar and enables new features of the new header.
    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("View history")
                    onClicked: pageStack.Push(page1)
                    progression: true
                }
                ListItem.Standard {
                    text: i18n.tr("External page")
                    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: "ttile: " + modelData.title }
                        Text { text: "iconeSource: $" + modelData.media.m }
                    }
                    function request() {
                        var xhr = new XMLHttpRequest();
                        xhr.onreadystatechange = function() {
                            console.log("Ready state changed to : " + 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 aller à plusieurs reprises dans la fonction onreadystatechange ...

PS: j'ai ajouté l'autorisation "mise en réseau" dans app.apparmor

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

Essayez de modifier la ligne suivante:

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

...à:

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

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

1
Aaron Hastings