2017-07-20 2 views
3

質問が正しいかどうかわからない。より良い理解のために問題を説明しましょう。ランダムな英語の文字列をキーとして複数レベルのjsonオブジェクトを考えてみましょう。タスクは、オブジェクトを反復し、すべてのノードを訪問して、以前と同じ親オブジェクトを持つ同じキー(およびレベル)を持つ英語の文字列の翻訳されたテキストを含む別の同等のオブジェクトを作成することです。再帰を使用すると、翻訳は機能しますが、約束の中から最終翻訳オブジェクトを返すことは決してありません。しかし、エラーはありません。再フォーマットされたjsonオブジェクトをループして非同期の約束の呼び出しを行う方法

オブジェクト:

var obj = { 
    "MENU": { 
    "NODE": "Wait for her", 
    "RESPONSE": { 
     "ATTR": "We'll meet again", 
     "SEMANTICS": "The Dark Knighthood" 
    } 
    }, 
    "NODES": { 
    "STANDARDLIBRARY": { 
     "SERVER": "Never say never again", 
     "CATEGORIES":{ 
     "INFOPROTECTION":"Infoprotection", 
     "DATAMOTION":"Data In Motion", 
     "LOGGING":"Loggin is key to debugging", 
     "VERACITY": "Help me understand the best I can", 
     "VARIETY": "Silver surfer" 
     } 
    } 
    } 
}; 

コード:

const iterateAttributesAndParseJSON = (o) => { 
    return new Promise(
    function (resolve, reject) { 
     for(var a in o) { 
     if (typeof o[a] == 'object'){ 
      iterateAttributesAndParseJSON(o[a]) 
     }else{ 
      if(o[a] != '') { 
      translate(o[a], {from: 'en', to: 'nl'}).then(res => { 
       //return jsonObj[a]=res.text; 
       jsonObj[a]=res.text; 
       //console.log(jsonObj); 
       resolve(jsonObj); 
      }).catch(err => { 
       console.error(err) 
       reject(err); 
      }); 
      } 
     } 
     } 
    } 
    ); 
} 

iterateAttributesAndParseJSON(obj).then(asd => { console.log(`Resolved:`, asd) }, err => console.log(err)) 

注:翻訳再びthenableです。私はこのnpmモジュールを使用しました。 google-translate-api

+1

おそらく私は何かが不足していますが、翻訳の呼び出し後すぐにあなたはリターンを呼び出しています。それは、次の3行が実行されないことを意味しません(resolve()を含む)? –

+0

今すぐご確認ください。元のコードでは、返品がコメントされました。私はここにそれを貼り付ける間違いを開いた。 –

+1

この時点で私が知ることができるのは、再帰呼び出しの後に解決していないということだけです。私にとっては、「解決済み」という出力は得られません。コンソールログだけが機能内に記録されます。しかし、それはここに遅れて、私はその日のためにそれを梱包しなければなりません。運が良ければ、問題は面白いので明日それを見るかもしれません。 –

答えて

0

私はあなたが約束したすべてを利用して作業を完了でき、最適化されたコードではなく動作すると思います。

const translate = require('google-translate-api'); 

    //var jsonObj = {}; 

    var obj = { 
     "MENU": { 
      "NODE": "Wait for her", 
      "RESPONSE": { 
       "ATTR": "We'll meet again", 
       "SEMANTICS": "The Dark Knighthood" 
      } 
     }, 
     "NODES": { 
      "STANDARDLIBRARY": { 
       "SERVER": "Never say never again", 
       "CATEGORIES": { 
        "INFOPROTECTION": "Infoprotection", 
        "DATAMOTION": "Data In Motion", 
        "LOGGING": "Loggin is key to debugging", 
        "VERACITY": "Help me understand the best I can", 
        "VARIETY": "Silver surfer" 
       } 
      } 
     } 
    }; 

    var promises = []; 

    const iterateAttributesAndParseJSON = (o) => { 
     for (var a in o) { 
      if (typeof o[a] == 'object') { 
       iterateAttributesAndParseJSON(o[a]); 
      } else { 
       if (o[a] != '') { 
        var promise = translate(o[a], { from: 'en', to: 'nl' }).then(res => { 
         var jsonObj = {}; 
         jsonObj[a] = res.text; 
         return jsonObj; 
        }).catch(err => { 
         console.error(err) 
         // reject(err); 
        }); 
        promises.push(promise); 
       } 
      } 
     } 
    } 

    iterateAttributesAndParseJSON(obj); 
    console.log(promises.length); 

    Promise.all(promises).then(asd => { console.log(`Resolved:`, asd) }, err => console.log(err)) 

は、キーと翻訳の配列を印刷し、これは私が少しそれについて考え

0

役に立てば幸います。私はこれに非常に異なるデザインを使用します。それははるかに簡単で、Promissesを必要とせず、1つのネットワークのみコール

var obj = { 
 
    "MENU": { 
 
    "NODE": "Wait for her", 
 
    "RESPONSE": { 
 
     "ATTR": "We'll meet again", 
 
     "SEMANTICS": "The Dark Knighthood" 
 
    } 
 
    }, 
 
    "NODES": { 
 
    "STANDARDLIBRARY": { 
 
     "SERVER": "Never say never again", 
 
     "CATEGORIES":{ 
 
     "VERACITY": "Help me understand the best I can", 
 
     "VARIETY": "Silver surfer" 
 
     } 
 
    } 
 
    } 
 
}; 
 

 
var vals = []; 
 
shadow = JSON.parse(JSON.stringify(obj)); 
 
function traverse(obj, shadow, vals, cb) { 
 
    if (typeof obj == 'object') 
 
     for (var i in obj) 
 
      if (typeof obj[i] == 'object') 
 
       traverse(obj[i], shadow[i], vals, cb); 
 
      else 
 
       cb(i, obj, shadow, vals); 
 
    else 
 
     return false; 
 
} 
 

 
//setup shadow and array of values 
 
traverse(obj, shadow, vals, function(key, o, s, v) { 
 
    v.push(o[key]); 
 
    s[key] = v.length - 1; 
 
}); 
 

 
function callService(cb) { 
 
    console.log('... calling translation service... please wait..'); 
 
    setTimeout(function() { 
 
     //call translation Service HERE use array vals if service accepts arrays 
 
     // or vals.join(DELIM); where DELIM is something you know the service won't touch 
 
     cb(vals.map(function(v) {return v + '-translated'})); 
 
    }, 1000); 
 
} 
 

 
callService(function(translatedArr) { 
 
    traverse(obj, shadow, vals, function(key, o, s, v) { 
 
     o[key] = translatedArr[s[key]]; 
 
    }); 
 
    console.log(obj); 
 
});

は、あなたがそれを好きなら、私に知らせて下さい要求すべきです。

関連する問題