2011-10-30 12 views
2

文字列とフレーズを他の関数に変換し、変換された部分を含む配列を返さなければなりません。 別の関数で関数を呼び出して、返された値をキャプチャしようとすると、返された値が定義されていないというメッセージが返され続けます。私が翻訳関数に値を返させないで、彼女が返すべき値を警告するようにしたら、すべてうまくいく。my関数の値は定義されていません

これは、関数translate()が値を適切に返すのを妨げるもの、または関数picklanguage()が返された値を受け取らないものです。

function translate(translateObject) 
{ 
    var translations = new Array(); 

    dojo.xhrPost({ 
     url: 'http://'+window.location.hostname+'/translate/translate', 
     content: { str: dojo.toJson(translateObject) }, 
     handleAs: "json", 
     timeout: 2000, 
     load: function(response){ 

      dojo.forEach(response.items, function(strg){ 
        var key = strg.string; 
        translations[strg.string] = strg.translation; 
       }); 

      return translations; 
     }, 
     error: function(response){ 
       return 'Ben'; 
     } 
    }); 
} 

function pickLanguage() 
{ 
    var language = translate({title: 'Kies hier je gewenste taal', dutch: 'Nederlands', french: 'French', german: 'Deutch', english: 'English'}); 

    errorDialog = new dijit.Dialog({ 
      content: dump(language), 
      style: "width: 450px" 
     }); 

    errorDialog.show(); 
} 
+1

非同期操作から値を返すことはできません。 – Pointy

+0

このタイプの問題についてはFAQが必要です。 1つはありますか? –

答えて

3

あなたは JAX – 非同期呼び出しを使用しています。

loadコールバックはの後に実行されます。の後に関数が終了します。そこから値を返すことはできません。

コールバックを使用して値を返す必要があります。方法はxhrPostです。

3

dojo.xhrPostの仕組みが誤解されていると思います。あなたがコールバックをする必要がありますので、それは、非同期です:

function translate(translateObject, callback) 
{ 
    var translations = new Array(); 

    dojo.xhrPost({ 
     url: 'http://'+window.location.hostname+'/translate/translate', 
     content: { str: dojo.toJson(translateObject) }, 
     handleAs: "json", 
     timeout: 2000, 
     load: function(response){ 

      dojo.forEach(response.items, function(strg){ 
        var key = strg.string; 
        translations[strg.string] = strg.translation; 
       }); 

      callback(translations); 
     }, 
     error: function(response){ 
       callback('Ben'); 
     } 
    }); 
} 

function pickLanguage() 
{ 
    translate({title: 'Kies hier je gewenste taal', dutch: 'Nederlands', french: 'French', german: 'Deutch', english: 'English'}, function(language) { 
     errorDialog = new dijit.Dialog({ 
       content: dump(language), 
       style: "width: 450px" 
     }); 

     errorDialog.show(); 
    }); 
} 
+0

ありがとう!私は、非同期とコールバックに関する部分を非常によく理解していませんでした。 – user1020761

0

translate関数はすぐに戻ります。

これはajaxリクエストです。非同期で処理されます。 pickLanguageのコードは、Ajaxコールバックに含まれている必要があります。このコールバックは、Ajaxコールが戻ったときに実行されます。

関連する問題