我试图编写一个函数,该函数不会返回它的值,直到函数内部的Promise解析为止。这是我尝试做的简化示例。
'use strict';
function get(db, id) {
let p = db.command('GET', 'group:${id}');
p.then(g => {
g.memberNames = [];
g.members.forEach(id => {
User.get(db, id)
.then(profile => g.memberNames.push(profile.name))
.catch(err => reject(err));
});
return g;
});
}
它是一个请求组ID并返回该组数据的函数。在此过程中,它还将用户的名字输入到数据结构中以显示其名称而不是用户ID。我的问题是这是异步运行的并且会跳过.then回调。当它返回g时,没有调用任何回调并且g.memberNames
仍为空。有没有办法让函数等到返回g,直到所有回调被调用?
我已经看到很多关于等待的东西。这有必要吗?将其他库添加到我的项目中是非常不受欢迎的。
答案 0 :(得分:2)
由于您返回所有配置文件名称的操作也是异步的,因此当使用Promise.all
paramFile =io.TextIOWrapper(request.FILES['pic'].file)
portfolio1 = csv.DictReader(paramFile)
print(type(paramFile))
users = []
users = [row["BASE_NAME"] for row in portfolio1]
print(len(users))
答案 1 :(得分:0)
有没有办法让函数等到返回
g
,直到所有回调都被调用?
是的,有。但是你应该改变你的思维方式,从“等待所有回调被调用”到“等待所有承诺完成”。事实上,Promise.all
函数通常会做到这一点 - 它接受一系列的promise并返回一个新的promise,它将以一系列结果解析。
在你的情况下,它将是
function get(db, id) {
return db.command('GET', 'group:${id}').then(g => {
var promises = g.members.map(id => {
// ^^^ never use `forEach`
return User.get(db, id).then(profile => profile.name);
// ^^^^^^ a promise for the name of that profile
});
//
return Promise.all(promises).then(names => {
// ^^^^^^^^^^ fulfills with an array of the names
g.memberNames = names;
return g;
});
});
}