2016-11-12 78 views
1

路由如何使这个功能成为一个承诺?

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

我想findUserInApi是一个承诺,因为我需要等待的获取就是这样函数内部发生的事情我使用快递。

这是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); 
     }); 
    }); 
}; 

我以前只是返回null时未找到或foundUser时被发现,但我想通过返回Promise.resolve做出承诺了出来。我不知道如何得到这个固定的...

+0

'findUserInApi'返回undefined。只需要返回承诺呢? – Oriol

+2

'return findChattersPerRole()'? 'then'函数返回的承诺本身,所以我不知道,如果你需要通过调用'Promise.resolve'返回'解决promise'。 –

回答

2

您需要返回您的整个承诺链,就像这样:

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

注意在return findChattersPerRole().then()加入return

但是,您嵌套承诺链。这是一种反模式。此外,如在评论中提到的,你不需要在.then()使用Promise.resolve(),它会自动应用。你的代码可以重构为这样的:

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

哦,我想我已经开始看到它了。所以如果你曾经开始承诺,并在接下来的“那么”你回报一些东西,你可以继续链接那个承诺?你不需要在每个“当时”都回复承诺? – Kevin

+0

“你不需要返回中的每一个承诺‘那么’?”您可以返回承诺或价值。如果你在'then'中返回一个值,那么'then'将返回一个已经解决的承诺。 “你可以继续链接那个承诺?”正确。这是承诺的力量! – RyanZim