这可能是一个愚蠢的问题,但学校里没有人知道如何做到这一点。
我有这个完美的代码(它发送对象表potentials
,我可以在客户端使用它)但我记得我也需要另一个(userData
)。
所以我尝试将其声明为const
,然后在res.render
之前将其记录下来,但它是undefined
。我们这群学生对目前的承诺并不是很熟悉,所以也许我们在这里遗漏了一些东西。
无论如何这里是我的代码,任何帮助?谢谢。
function matchaSearch (pool, username) {
return suggestUsers(pool, username)
.then((searcherInfos) => {
userData = [...searcherInfos]
if (userData[0].sex === 'm' && userData[0].orientation === 's') {
return lookForSF(pool, username)
} else if ((userData[0].sex) && userData[0].orientation === 'b') {
return lookForbothCauseImB(pool, username)
} else if ((userData[0].sex) === 'f' && userData[0].orientation === 's') {
return lookForSM(pool, username)
} else if ((userData[0].sex) === 'm' && userData[0].orientation === 'g') {
return lookForGM(pool, username)
} else if ((userData[0].sex) === 'f' && userData[0].orientation === 'g') {
return lookforGF(pool, username)
}
})
.then((rows) => {
var potentials = rows;
return (potentials)
})
}
router.post('/matchaSearch', function (req, res) {
const userData = []
matchaSearch(pool, session.uniqueID)
.then((potentials) => {
console.log(userData);
res.render('./userMatch', {potentials, userData})
})
.catch((err) => {
console.error('error', err)
res.status(500).send("we don't have any suggestions for you so far")
})
})
答案 0 :(得分:0)
你没有以正确的方式使用Promise
,没有任何回报。您的代码示例可以是
var searcherInfosPro = (searcherInfos)=>{
return new Promise((fullfill,reject)=>{
userData = [...searcherInfos];
if (userData[0].sex === 'm' && userData[0].orientation === 's') {
fullfill([pool,username]);
}else if((userData[0].sex) && userData[0].orientation === 'b') {
fullfill([pool,username]);
}else{
reject((new Error("Some error detected"));
}
});
}
你可以使用
来调用它suggestUsers(pool, username)
.then(searcherInfosPro)
.then((rows) => {
var [pool,username] = rows;
return (potentials)
})
.catch((ex)=>{
console.log(ex.message);
});
查看您的代码,对我来说并不是很清楚,因此上面的代码是关于如何正确使用promise并将数据传递给下一个的简短版本。另外请记住始终使用catch
表示任何错误。
从上面的代码中,
else
案例会调用并发生错误并打印Some error detected
。
答案 1 :(得分:0)
这是我做的,它对我有用:
router.post('/matchaSearch', function (req, res) {
matchaSearch(pool, session.uniqueID)
.then((potentials) => {
userData = suggestUsers(pool, username)
.then((rows) => {
res.render('./userMatch', {potentials, rows})
})
})
.catch((err) => {
console.error('error', err)
res.status(500).send("we don't have any suggestions for you so far")
})
})
答案 2 :(得分:0)
看起来您找到了部分问题的答案。我想我会告诉你一个更清洁的方法来做到这一点,提供了以下改进:
userData
设置为更高范围的变量的副作用编程,以便您以后可以选择它。代码:
const fnLookup = {
'ms': lookForSF,
'fs': lookForSM,
'mg': lookForGM,
'fg': lookForGF,
'mb': lookForbothCauseImB,
'fb': lookForbothCauseImB
};
function matchaSearch (pool, username) {
return suggestUsers(pool, username).then(searcherInfos => {
let userData = [...searcherInfos];
let fn = fnLookup[userData[0].sex + userData[0].orientation];
if (fn) {
return fn(pool, username).then(potentials => {
return {potentials, userData};
});
} else {
throw new Error(`Unexpected values for sex ${userData[0].sex} or orientation ${userData[0].orientation}`);
}
});
}
router.post('/matchaSearch', (req, res) => {
matchaSearch(pool, session.uniqueID).then(data => {
console.log(data.userData);
res.render('./userMatch', data);
}).catch(err => {
console.error('error', err)
res.status(500).send("we don't have any suggestions for you so far")
});
});