如何return响应多个异步调用?
How to return the response of multiple asynchronous calls?
类似于这个问题:Return response from async call
除了调用在多次调用异步函数的循环中。
具体如何返回s的值呢?此代码 returns 未定义。该函数在 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;
});
}
你并没有真正展示你是如何进行循环的,这使得猜测推荐的内容变得有点困难。但是假设 .fetch().then()
returns 一个承诺,这里有一个一般的想法,标准的 ES6 承诺内置于 node.js:
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
});
Var s
是不必要的。只需 return 然后的成功回调中的 "prénom nom" 字符串。
function getUsernameFromDBAsync(userId) {
return new Model.Users({
idUser: userId
}).fetch().then(function (u) {
return u.get('firstName') + ' ' + u.get('familyName');
});
}
您的 "loop" 可以通过 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);
});
类似于这个问题:Return response from async call 除了调用在多次调用异步函数的循环中。
具体如何返回s的值呢?此代码 returns 未定义。该函数在 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;
});
}
你并没有真正展示你是如何进行循环的,这使得猜测推荐的内容变得有点困难。但是假设 .fetch().then()
returns 一个承诺,这里有一个一般的想法,标准的 ES6 承诺内置于 node.js:
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
});
Var s
是不必要的。只需 return 然后的成功回调中的 "prénom nom" 字符串。
function getUsernameFromDBAsync(userId) {
return new Model.Users({
idUser: userId
}).fetch().then(function (u) {
return u.get('firstName') + ' ' + u.get('familyName');
});
}
您的 "loop" 可以通过 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);
});