2

Windows 8用の最初のWinJSアプリで作業していて、2グリッドテンプレートで指定されたベースコードを置き換えようとしていますが、次のエラーが発生します。

Unable to get property 'forEach' of undefined or null reference

私のコード:

getData().forEach(function (item) {
    list.push(item);
});

初期機能:

function getData() {

    // JSON request
    WinJS.xhr({
        type: "GET",
        url: "http://mytld.com/mobile/pagethatreturnsjsondata.php"
    }).then(
            function (response) {
                OnSuccessCall(response);
            },
            function (error) {
                var err = error;
                console.log("Error : " + err.message);
            },
            function (progress) { }
    );
}

以下は、JSONデータを返すphpWebサービスからデータを取得しています。

function OnSuccessCall(response) {
    var itemContent = "<p>Item Content</p>";
    var itemDescription = "Item Description";
    var groupDescription = "Group Description";

    // These three strings encode placeholder images. You will want to set the
    // backgroundImage property in your real data to be URLs to images.
    var darkGray = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXY3B0cPoPAANMAcOba1BlAAAAAElFTkSuQmCC";
    var lightGray = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXY7h4+cp/AAhpA3h+ANDKAAAAAElFTkSuQmCC";
    var mediumGray = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXY5g8dcZ/AAY/AsAlWFQ+AAAAAElFTkSuQmCC";

    // Each of these sample groups must have a unique key to be displayed separately.
    var sampleGroups = [
        { key: "group1", title: "prayers", subtitle: "submitted prayers", backgroundImage: darkGray, description: groupDescription }
    ];

    var x = response.responseText.length;
    var json = JSON.parse(response.responseText);
    var sampleItems = [];
    for (var i = 0; i < json.length - 1; i++) {
        sampleItems.push({
            group: sampleGroups[0],
            title: json[i].text,
            subtitle: "Item Subtitle: 1",
            description: itemDescription,
            content: itemContent,
            backgroundImage: lightGray
        });
    }

    return sampleItems;
}

sampleItemsでデータを見ることができます:

オブジェクトデータを含むウォッチウィンドウ

オブジェクトの結果を元のサンプルデータの結果と比較すると、実質的に同じであるため、明らかに何か間違ったことをしています。

どんな助けでも大歓迎です。

4

1 に答える 1

3

関数にはステートメントgetData()がないため、 が返されます。そして、あなたはできません。returnundefinedforEachundefined

全体像を見ると、 をgetData()使用xhrしているため、実際には結果が返されません。代わりに、データが非同期に取得されます。したがってforEach、結果がまだ存在しないため、戻り値を返すことはできません。promise が完了するまで待つ必要があります。その後forEach、promise の結果を呼び出すことができます。

function getData() {
    // add "return" here so the function returns a Promise
    return WinJS.xhr({
        type: "GET",
        url: "http://mytld.com/mobile/pagethatreturnsjsondata.php"
    }).then(
            function (response) {
                // add "return" here to specify the promise's completed value
                return OnSuccessCall(response);
            },
            function (error) {
                var err = error;
                console.log("Error : " + err.message);
            },
            function (progress) { }
    );
}

getData()何か (Promise)を返すようになったので、Promise が完了したときに実行されるように作業をスケジュールできます。

getData().then(function(results) { results.forEach(...) });
于 2013-01-06T14:54:39.597 に答える