如何在JavaScript中等待函数的承诺

在我的Node.js应用程序中,我有一个循环访问URL数组并获取它们的值的函数,一旦循环完成,它将以Map的forms返回最终值。 代码如下。

let getResults = function(urls){ let results = new Map(); let retrievePromises = []; urls.forEach(function (value, i) { retrievePromises.push( restAgent.get(value).then(function(data){ for (let item of data.items) { let name = item.filter(n => n.name === "somename"); //filter array let obj = {}; obj.name = item.name; obj.address = item.address; results.set(name, obj); } }).catch(function(err){ console.log(err); }) ); }); Promise.all(retrievePromises).then(function(){ return this.results; }); } 

如果我运行, console.log(getResults()); 它会返回undefined因为它是在函数返回结果之前触发的。 如何解决这个问题, 因为我是Promises的新手 ,对代码的任何可能的改进? (我知道每个人都不好)

你必须返回Promise 。 在你的情况下,你将不得不return Promise.all

 let getResults = function(urls){ let results = new Map(); let retrievePromises = []; urls.forEach(function (value, i) { retrievePromises.push( restAgent.get(value).then(function(data){ for (let item of data.items) { let name = item.filter(n => n.name === "somename"); //filter array let obj = {}; obj.name = item.name; obj.address = item.address; results.set(name, obj); } }).catch(function(err){ console.log(err); }) ); }); return Promise.all(retrievePromises).then(function(){ return results; }); } 

没有必要改进,你的代码是最优的。 做得好!

要检查结果,您必须在调用getResults()时执行.then() getResults() 。 如果你做console.log(getResults()); 你会得到承诺的对象。

要看到你所要做的结果

 getResults(urls).then(function(results){ console.log(results); })