微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将我的javascript回调流程转换为Promise?

function getMentionedUsers(str, next){
    var array = getUsernamesFromString(str); //['john','alex','jess'];
    if(array.length > 0){
        var users = [];
        var pending = array.length;
        array.forEach(function(username){
            getUserByUsername(username).then(function(model){
                users.push(model.key);
                --pending || next(users); //this is a callback model
            }); 
        });
    }
};

function getUserByUsername(username){
    return admin.database().ref('/users').orderByChild('username').equalTo(username).once('value').then(function(snapshot) {
        return snapshot.val(); //this is the firebase example of a promise
    });
};

现在,我这样做:

    getMentionedUsers(model.body, function(users){
        console.log("Mentions", users);
    });

但是,我想把getMentionedUsers变成一个承诺.我怎样才能做到这一点?我是Promises的新手

解决方法:

你可以使用Promise.all和Array #map:

function getMentionedUsers(str) {
  return Promise.all(getUsernamesFromString(str).map((username) => {
    return getUserByUsername(username).then((model) => model.key);
  }));
}

更易阅读的版本分为两个功能

function getUserKeyByUsername(username) {
  return getUserByUsername(username).then((user) => user.key);
}

function getMentionedUsers(str) {
  const promises = getUsernamesFromString(str).map(getUserKeyByUsername);
  return Promise.all(promises);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐