2017-09-08 39 views
0

如何重构下面的代码?Javascript,Ember 2,如何重构承诺的代码(也许还有异步/等待)

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

这样的两个小函数:'console.log(error)'。无论如何,问题是这个代码。你会怎么做? –

+0

'get()'有点混乱。在第一次和第二次使用时,它似乎是*异步*,而在第三次使用时它看起来是*同步*。这是什么? –

回答

3

我认为你可能会失去的最复杂的是通过压扁数组数组。但是,如果您需要该代码的结果,这将不起作用。不过,我想你只是想保存所有的单词。

然后,我会做这样的事情:

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()))}); 

或异步功能:

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())); 

但是,如果你真的需要这个结构我想起来拆分代码成多个功能。像saveWordsForCategory,saveWordsForPosts,saveWordssaveWord