繁体   English   中英

Javascript,Ember 2,如何重构承诺代码(也可以使用async / await)

[英]Javascript, Ember 2, How to refactor this code of promises (maybe also with 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));
          })
        );
      })
    )
  );
});

另外,当我在此代码上具有以下lint规则时,我还想了解如何避免具有许多功能:

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

如何使用异步/等待?

我认为您可能会失去的最复杂的方法是将数组变平。 但是,如果您需要该代码的结果,则将无法使用。 但是我假设您只想保存所有单词。

然后我会做这样的事情:

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

但是,如果您确实需要这种结构,我会将您的代码分成多个功能。 saveWordsForCategorysaveWordsForPostssaveWordssaveWord

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM