从此承诺中返回一个值

时间:2017-02-01 17:12:39

标签: javascript node.js express promise pug

这可能是一个愚蠢的问题,但学校里没有人知道如何做到这一点。 我有这个完美的代码(它发送对象表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")
})
})

3 个答案:

答案 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)

看起来您找到了部分问题的答案。我想我会告诉你一个更清洁的方法来做到这一点,提供了以下改进:

  1. 将所有if / else子句替换为查找表。
  2. 删除试图将userData设置为更高范围的变量的副作用编程,以便您以后可以选择它。
  3. 如何从promise中返回多个值(通过将它们包装在对象中)。
  4. 代码:

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