1

私はdojoを初めて使用しますが、DeferredAPIの処理で特定のエラーが発生します。

私の呼び出しコードは

function openEditor(id, fieldName) {
    editOptionsDialog_fetchData(id, fieldName).then(function(data){
    console.log("done!");
    });
    console.log("leaving openEditor!");
}

この関数を呼び出す

function editOptionsDialog_fetchData(id, fieldName) {
    require(["dojo/ready", "dojo/data/ObjectStore", "dojo/Deferred"], function(ready,     ObjectStore, Deferred) {
        var store;
        var def;

        switch (fieldName) {
            case "degree":
                store = new degreeStore();
                def = store.getJsonData();
                break;
            case "faculty":
                store = new facultyStore();
                def = store.getJsonData();
                break;
            default:
                console.log("error in editOptionsDialog_fetchData: " + fieldName);
        }

        return def.then(function(data){
            store.data = data.items;
            editOptionsDialog_select.setStore(new ObjectStore({ objectStore : store }));
            editOptionsDialog_select.store.query({ "id" : id });
            editOptionsDialog_select.startup();
        });
    });
}

ここで、store.getJsonData()はDeferredを作成します。これは、Deferred解決を連鎖させるために使用します(本文の後の追加コードを参照してください)。

私が受け取るエラーは

editOptionsDialog_fetchData(id, fieldName).then(function(data)...) is undefined

openEditor関数にアクセスした直後にエラーメッセージが表示されるため、コールバックがまだ行われていないため、関数呼び出しの値を未定義にする必要があることは明らかです。

私の質問は、遅延APIのこの誤解が私のコード内にある必要がある場合です。これは、非同期呼び出しが実行されて呼び出されたときにeditOptionsDialogの関数呼び出しを評価することであり、この呼び出しが終了する前ではないためです(関数呼び出しがまだ未定義につながる状態ですが、これがthen-returnの目的だと思いました)。

あなたの助けのためのThx

--- getJsonData()の追加コード---

getJsonData: function() {
        return xhr(this.handlerUrl, {
            handleAs: "json",
            method: "POST",
            data: {
                action: "getJsonData"
            }
        }).then(function(data){
            return data;
        }, function(err){
            alert("Data cannot be fetched in degreeStore.getJsonData! " + err);
        });
    }
4

2 に答える 2

1

私はあなたがやろうとしていることを示すためにフィドルを作成しました。

editOptionsDialog_fetchData基本的に、からメソッドにDeferredを返しgetJsonDataます。 に戻るeditOptionsDialog_fetchData別のものを作成します。で、最初の解決を2番目の解決に接続します。DeferredopenEditoreditOptionsDialog_fetchDataDeferredDeferred

http://jsfiddle.net/cswing/yUTT8/

于 2012-11-15T16:18:25.470 に答える
0

コードを再構築することで問題を解決しました。原則として、Deferred-objectは明確なrequire-clauseに戻すことができないようです。したがって、これは私のために働いた:

var editMultilanguageDialog_Startup;
// one require-clause, wrapping all the Deferred-sensitive statements
require(["dojo/request/xhr", "dojo/json", "dojo/Deferred", "dojo/store/Memory", "dojox/timing", "dojo/domReady!"], function(xhr, json, Deferred, Memory, timing, domReady) {

   function editMultilanguageDialog_Startup(id, fieldName) {
    // code from former mainForm -> moved into this require-clause
    //[...]
    // here, the invocation is no longer undefined and waits for the resolve        
    editMultilanguageDialog_fetchData(id, fieldName).then(function(data){
            //[...]
            editMultilanguageDialog.show(); 
        });    
    }

    function editMultilanguageDialog_fetchData(id, fieldName) {
        // unchanged, returns Deferred
    }

}); 

これは回避策です。この機能がdojoによって意図されているかどうかはわかりません。

于 2012-11-17T11:13:07.933 に答える