【问题标题】:How to return the response of multiple asynchronous calls?如何返回多个异步调用的响应?
【发布时间】:2015-11-03 10:02:34
【问题描述】:

与这个问题类似:Return response from async call 除了调用是在多次调用异步函数的循环内。

具体来说,如何返回s的值呢?此代码返回未定义。此函数在 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;
        });
}

【问题讨论】:

  • 你在使用 Promise 库吗?还是节点 4?
  • 一个或多个都无所谓你需要回调也处理数据,不能返回数据顾名思义它是异步的。
  • 我正在使用节点 4。我尝试了 promisejs。

标签: javascript asynchronous promise bookshelf.js


【解决方案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
});

【讨论】:

    【解决方案2】:

    变量s 是不必要的。只需从 then 的成功回调中返回“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.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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多