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

TIM*_*MEX 3 javascript asynchronous 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
    });
};
Run Code Online (Sandbox Code Playgroud)

现在,我这样做:

    getMentionedUsers(model.body, function(users){
        console.log("Mentions", users);
    });
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*leJ 5

你可以使用Promise.allArray#map:

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

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

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

function getMentionedUsers(str) {
  const promises = getUsernamesFromString(str).map(getUserKeyByUsername);
  return Promise.all(promises);
}
Run Code Online (Sandbox Code Playgroud)

  • @mrBorna请解释为什么它不可读. (2认同)