2016-11-12 4 views
1

IchWie mache ich diese Funktion zu einem Versprechen?

app.get('/api/users/:username', (req, res) => { 
    let username = req.params.username; 
    findUserInApi(username) 
    .then(foundUser => { 
     if (foundUser) { 
     res.status(403).send('User not found in api yet'); 
     }else{ 
     res.json(foundUser); 
     } 
    }); 
}); 

routen express mit Ich möchte findUserInApi ein Versprechen sein, weil ich warten müssen, um auf die holen, dass innerhalb dieser Funktion geschieht.

dies findUserInApi

const findUserInApi = (username) => { 
    findChattersPerRole() 
    .then(chattersPerRole => { 
     console.log(`${username} should\'ve been added by now...`); 
     //console.log(chattersPerRole); 
     let wantedUser = find(chattersPerRole, {username}); 
     if (!wantedUser) { 
     console.log(`${wantedUser} wasn't found m8`); 
     return Promise.resolve(null); 
     } 
     console.log('wanteduser is: ', wantedUser); 
     getUserByUsername(wantedUser.username) 
     .then(foundUser => { 
      console.log('founduser is: ', foundUser); 
      return Promise.resolve(foundUser); 
     }); 
    }); 
}; 

ich nur null zurück verwendet, wenn sie nicht oder foundUser gefunden, als er gefunden wurde, aber ich versuchte Versprechen aus ihnen Promise.resolve durch die Rückkehr zu machen. Ich bin nicht sicher, wie dieser Fehler behoben zu bekommen ...

+0

'findUserInApi' gibt undefined zurück. Liefern Sie einfach das Versprechen zurück? – Oriol

+2

'zurück findChattersPerRole()'? 'then'-Funktion gibt Versprechen selbst zurück, also bin ich mir nicht sicher, ob Sie' aufgelöstes Versprechen' zurückgeben müssen, indem Sie 'Promise.resolve' aufrufen. –

Antwort

2

Sie benötigen eine ganze Versprechen Kette zurück, wie folgt aus:

const findUserInApi = (username) => { 
    return findChattersPerRole() 
    .then(chattersPerRole => { 
     console.log(`${username} should\'ve been added by now...`); 
     //console.log(chattersPerRole); 
     let wantedUser = find(chattersPerRole, {username}); 
     if (!wantedUser) { 
     console.log(`${wantedUser} wasn't found m8`); 
     return Promise.resolve(null); 
     } 
     console.log('wanteduser is: ', wantedUser); 
     getUserByUsername(wantedUser.username) 
     .then(foundUser => { 
      console.log('founduser is: ', foundUser); 
      return Promise.resolve(foundUser); 
     }); 
    }); 
}; 

Notiere die Zugabe von return in return findChattersPerRole().then().

Sie verschachteln jedoch Versprechensketten. Das ist ein Anti-Muster. Wie in den Kommentaren erwähnt, müssen Sie auch nicht Promise.resolve() in einem verwenden, es wird automatisch angewendet. Ihr Code könnte in etwa wie folgt umstrukturiert werden:

const findUserInApi = (username) => { 
    return findChattersPerRole() 
    .then(chattersPerRole => { 
     console.log(`${username} should\'ve been added by now...`); 
     //console.log(chattersPerRole); 
     return find(chattersPerRole, {username}); 
    }) 
    .then(wantedUser => { 
     if (wantedUser) { 
     console.log('wanteduser is: ', wantedUser); 
     return getUserByUsername(wantedUser.username); 
     } 
     else console.log(`${wantedUser} wasn't found m8`); 
    }) 
    .then(foundUser => { 
     if (foundUser) console.log('founduser is: ', foundUser); 
     return foundUser; 
    }); 
}; 
+0

Oh, ich denke ich fange an es zu sehen. Also, wenn du jemals ein Versprechen beginnst und im nächsten "dann" etwas zurückbringst, kannst du dieses Versprechen einfach weiter verketten? Sie müssen kein Versprechen in jedem "dann" zurückgeben? – Kevin

+0

"Sie müssen kein Versprechen in jedem" dann "zurückgeben?" Sie können ein Versprechen oder einen Wert zurückgeben. Wenn Sie einen Wert in einem 'then 'zurückgeben, gibt das' then' eine aufgelöste Zusage mit diesem Wert zurück. "Sie können dieses Versprechen einfach weiter verketten?" Richtig. Das ist die Kraft der Versprechen! – RyanZim

Verwandte Themen