0

アプリに最も明確なコードを組み込みたい。そこで、xhr の呼び出しと解析を view.js から分離することにしました。そうするために私は追加しました:

View.js で

this._pagePromises.push(myapp.Services.Foo.getFoo()
.then(
    function success(results) {
      var x = results;
    },
    function error() {
      // TODO - handle the error.
    }
));

そしてServices.jsで

Foo:
{   
    getFoo: function () {
        WinJS.xhr({ url: "http://sampleurl.com" }).done(
            function completed(request) {
                //parse request
                var obj = myapp.Parser.parse(request);
                return obj;
            },
            function error(request) {
                // handle error conditions.
            }
        );  
    }
}

しかし、私はこの例外があります:

0x800a138f - JavaScript ランタイム エラー: 未定義または null 参照のプロパティ 'then' を取得できません

私が欲しいのは: view.js で約束を開始し、getFoo() が完了したときにビューを更新します。私はこれを正しい方法で行っていませんが、C# 開発者として、このパターンを理解するのにいくつかの困難があります。

編集:私の更新されたコードがあります:

getFoo: function () {
var promise = WinJS.xhr({ url: myapp.WebServices.getfooUrl() });
    promise.done(
        function completed(request) {
            var xmlElements = request.responseXML;
            var parser = new myapp.Parser.foo();
            var items = parser.parse(xmlElements);
            return items;
        },
        function error(request) {
            // handle error conditions.
        }
    );
    return promise;
}

「その後」に関する私の問題は解決しましたが、「返品の約束」は「返品アイテム」の前に呼び出されます。したがって、私の「呼び出し元」は約束を受け取るだけで、結果は受け取りません。

私は何を取りこぼしたか ?

編集2:これを行う正しい方法があります:

Foo:
{
    getFooAsync: function () {
        return WinJS.Promise.wrap(this.getXmlFooAsync().then(
            function completed(request) {

                var xmlElements = request.responseXML;
                var parser = new myapp.Parser.Foo();
                var items = parser.parse(xmlElements);
                return items;
            }
        ));  
    },

    getXmlFooAsync: function () {
      return WinJS.xhr({ url: "http://sampleurl.com" });
    }
}
4

1 に答える 1

5

これを行うよりコンパクトな方法は、関数が WinJS.xhr().then() からの戻り値を返すようにすることです。これが行うことは、内部の完了ハンドラーの戻り値で満たされる promise を返すことです。

Foo:
{
    getFooAsync: function () {
        return WinJS.xhr({ url: "http://sampleurl.com" }).then(
            function completed(request) {
                var xmlElements = request.responseXML;
                var parser = new myapp.Parser.Foo();
                var items = parser.parse(xmlElements);
                return items;
            }
        ));  
    },
}

呼び出し元は、getFooAsync から取得した promise で then/done を使用できます。完了したハンドラーの結果は、完了したハンドラーによって返されたアイテムになります。(Promise を返したいので、この関数内で .done を使用しないでください。)

これは、連鎖を可能にするために Promises-A で指定されたthenの動作です。詳細については、Windows 8 開発者ブログの私の投稿 ( http://blogs.msdn.com/b/windowsappdev/archive/2013/06/11/all-about-promises-for-windows-store-apps ) を参照してください。 -書かれた-javascript.aspx .

于 2013-07-11T16:36:16.753 に答える