与此问题类似:Return response from async call 除了调用是在多次调用异步函数的循环内。
具体来说,如何返回s的值?此代码返回undefined。在for循环中调用此函数。用于ORM的库是Bookshelfjs。谢谢你的帮助。
function getUsernameFromDBAsync(userId) {
var s = "moo";
new Model.Users({
idUser: userId
})
.fetch()
.then(function(u) {
var prenom = u.get('firstName');
var nom = u.get('familyName');
s = prenom + " " + nom;
return s;
});
}
答案 0 :(得分:1)
你并没有真正展示你是如何进行循环的,这让你有点难以猜测推荐什么。但假设.fetch().then()
返回一个promise,这里有一个关于node.js内置的标准ES6 promise的一般概念:
function getUsernameFromDBAsync(userId) {
var s = "moo";
return new Model.Users({
idUser: userId
}).fetch().then(function (u) {
var prenom = u.get('firstName');
var nom = u.get('familyName');
s = prenom + " " + nom;
return s;
});
}
var userIds = [...];
var promises = [];
for (var i = 0; i < userIds.length; i++) {
promises.push(getUsernameFromDBAsync(userIds[i]));
}
// now set up a .then() handler for when all the promises are done
Promise.all(promises).then(function(names) {
// process names array here
}, function(err) {
// process error here
});
如果您正在使用Bluebird promise库,那么您可以更简单地执行此操作:
function getUsernameFromDBAsync(userId) {
var s = "moo";
return new Model.Users({
idUser: userId
}).fetch().then(function (u) {
var prenom = u.get('firstName');
var nom = u.get('familyName');
s = prenom + " " + nom;
return s;
});
}
var userIds = [...];
Promise.map(userIds, getUsernameFromDbAsync).then(function(names) {
// process names array here
}, function(err) {
// process error here
});
答案 1 :(得分:0)
Var s
是不必要的。只需从当时的成功回调中返回“prénomnom”字符串。
function getUsernameFromDBAsync(userId) {
return new Model.Users({
idUser: userId
}).fetch().then(function (u) {
return u.get('firstName') + ' ' + u.get('familyName');
});
}
您的“循环”可以通过Array.prototype.map()生成一个承诺数组,然后是Promise.all(promises).then(...)
,以便在所有承诺都已解决后接收并处理一系列名称。
var promises = userIds.map(function(userId) {
return getUsernameFromDBAsync(userId);
});
Promise.all(promises).then(function(names) {
// do something with `names`, which is an array of `prénom nom` strings.
}, function(err) {
// handler error, eg ...
console.error(error);
});
或者更简洁:
Promise.all(userIds.map(getUsernameFromDBAsync)).then(function(names) {
// do something with `names`, which is an array of `prénom nom` strings.
}, function(err) {
// handler error, eg ...
console.error(error);
});