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

时间:2015-11-01 19:48:52

标签: javascript asynchronous promise bookshelf.js

与此问题类似: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;
        });
}

2 个答案:

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