如何在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); })