IT虾米网

javascript之Nodejs 与 promise 并行

tintown 2023年12月27日 编程语言 148 0

我有一个这样的字典:

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

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

请您参考如下方法:

首先,避免显式构造。现在我们已经结束了 - 我们可以通过首先获取所有单词,然后获取所有同义词,然后将它们折叠回字典来无需嵌套和 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, {}); 

顺便说一下,更好的解决方案可能是使用类似 wordnet 的东西,它可以让您指定距离并进行一次调用。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!