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