如何返回多个异步调用的响应

How to return the response of multiple asynchronous calls?

本文关键字:异步 调用 响应 何返回 返回      更新时间:2023-09-26

类似于这个问题:从异步调用返回响应除了调用在多次调用异步函数的循环中。

具体来说,如何返回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;
        });
}

你并没有真正展示你是如何进行循环的,这让你更难猜测该推荐什么。但假设.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
});

Var s是不必要的。只需从成功回调中返回"prénom-nom"字符串。

function getUsernameFromDBAsync(userId) {
    return new Model.Users({
        idUser: userId
    }).fetch().then(function (u) {
        return u.get('firstName') + ' ' + u.get('familyName');
    });
}

您的"循环"可以使用Array.prototype.map()生成一个promise数组,然后是Promise.all(promises).then(...),在所有promise都解析后接收和处理一个名称数组。

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);
});