Nodejs与promise保持并行

我有这样的字典:

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

一个键的价值是它的同义词。 而'getSynonymWords(word)'是一个asynchronous函数,它返回一个promise,其值是与传递参数相对应的同义词列表。 我怎样才能循环通过对象recursion地获得另一个对象:

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

这是不正确的,因为一些任务没有完成,但我不知道如何运行与承诺嵌套的任务。 我正在使用蓝鸟图书馆。 你可以帮帮我吗?

首先,避免明确的施工。 现在我们已经完成了 – 我们可以通过首先获取所有单词,然后获取所有的同义词,然后将它们折叠回字典,从而无需嵌套和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; } 

如果我们想要“聪明”,我们可以select一个class轮,我将在这里使用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, {}); 

顺便说一句,更好的解决scheme可能是使用类似wordnet的东西,让你指定的距离,并进行一个调用。