当前位置:  开发笔记 > 编程语言 > 正文

Nodejs与promise平行

如何解决《Nodejs与promise平行》经验,为你挑选了1个好方法。

我有这样的字典:

{go: ['went', 'run'], love: ['passion', 'like']}

密钥的值是其同义词.'getSynonymWords(word)'是一个异步函数,它返回一个promise,其中的值是与传递的参数对应的同义词列表.我如何循环遍历对象以递归方式获取另一个对象,如下所示:

{went: [], run: [], passion: [], like: []}

这是我的一段代码:

function getRelatedWords(dict) {
  return new Promise(function(resolve) {
    var newDict = {}; 
    for(var key in dict){
      if (dict.hasOwnProperty(key)) {
        var synonyms = dict[key];
        Promise.map(synonyms, function (synonym) {
          return getSynonymWords(synonym).then(function (synonyms) {
            newDict[synonym] = synonyms;
            return newDict;
          }); 
        }).then(function () {
          resolve(newDict);
        }); 
      }   
    }   
  }); 
}

这是不正确的,因为有些任务没有完成,但我不知道如何运行与promises嵌套的任务.我正在使用Bluebird库.你可以帮帮我吗?



1> Benjamin Gru..:

首先,避免明确的建设.现在我们已经完成了 - 我们可以通过首先获取所有单词,然后获取所有同义词,然后将它们折叠回字典,而不使用嵌套和4行代码.

function getRelatedWords(dict) {
   // first we get all the synonyms
   var synonyms = Object.keys(dict).map(x => dict[x]).reduce((p, c) => p.concat(c), []);
   // second we get all the synonyms for each word with the word itself
   var withSynonyms = Promise.map(synonyms, s => Promise.all([s, getSynonymWords(s)]));
   // then we fold it back to an object with Promise.reduce
   var asDict = withSynonyms.reduce((p, c) => p[c[0]] = c[1]), {});
   // and return it
   return asDict; 
}

如果我们想要"聪明",我们可以选择一个班轮,我将在这里使用ES2016来获得乐趣:

let {entries} = Object;
let {reduce, all} = Promise;
const getRelatedWords = dict => reduce(entries(dict), (p, c) => p.concat(c), []).map(s => [s, getSynonymWords(s)]).map(all).reduce((p, [s, syns]) => p[s] = syns, {});

更好的解决方案btw可能是使用像wordnet这样的东西,让你指定距离,并进行一次调用.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有