2017-09-08 9 views
0

以下のコードをどのようにリファクタリングすることができますか?Javascript、Ember 2、このコードをリファクタリングする方法(多分async/await)

get(category, "posts").then(posts => { 
    return all(
    posts.map(post => 
     get(post, "words").then(words => { 
     return all(
      words.map(word => { 
      if (!get(word, "hasDirtyAttributes")) { 
       return false; 
      } 
      return word 
       .save() 
       .then(() => this.ok()) 
       .catch(error => this.error(error)); 
      }) 
     ); 
     }) 
    ) 
); 
}); 

また、私は、私はこのコードで次の糸くずのルールを持っていたときに多くの機能を持つ避ける方法を理解したいと思います:

[eslint] Use named functions defined on objects to handle promises (ember/named-functions-in-promises) 

にはどうすればいいのawait /非同期使用することができますか?

+0

どのようにこの機能の応答を使用しますか?あなたはそれが必要なのでしょうか? 'this.ok()'と 'this.error()'とは何ですか? – Lux

+0

このような2つの小さな関数: 'console.log(error)'。とにかく問題はこのコードです。あなたはどうしますか? –

+0

'get()'はちょっと混乱します。最初と2回目の使用では、*非同期*のように見えますが、3回目の使用では*同期*のようです。どちらですか? –

答えて

3

私はあなたが失う可能性が最も複雑なのは、配列の配列を平坦化することだと思います。しかし、あなたがそのコードの結果を必要とする場合、これは動作しません。しかし、私はただあなたがすべての単語を保存したいと思います。あなたが本当にこのような構造が必要な場合は、私は、複数の機能にコードを分割するだろうしかし

const posts = await get(category, "posts"); 
const wordOfWords = await all(posts.map(post => get(post, "words"))); 
const words = wordOfWords.reduce((a, b) => [...a, ...b], []); 
const wordsWithDirtyAttrs = words.filter(word => get(word, "hasDirtyAttributes")); 
await all(wordsWithDirtyAttrs.map(word => word.save())); 

get(category, "posts").then(posts => { 
    return all(posts.map(post => get(post, "words"))); 
}) 
.then(wordOfWords => wordOfWords.reduce((a, b) => [...a, ...b], [])) 
.then(words => all(words.map(word => get(word, "hasDirtyAttributes") && word.save()))}); 

または非同期の機能を持つ:

それから私はこのような何かをするだろう。 saveWordsForCategory,saveWordsForPosts,saveWordsおよびsaveWordと同様である。

関連する問題