2017-02-01 1 views
-1

이것은 어리석은 질문 일 수도 있지만 학교에서 아무도 그렇게하는 방법을 모르는 사람입니다. 완벽하게 작동하는 코드가 있습니다 (객체 테이블 potentials을 전송하고 클라이언트 측에서도이 코드를 사용할 수 있습니다).하지만 다른 것을 필요로한다는 것을 기억했습니다 (userData). 그래서 나는 이것을 const으로 선언하고 나서 내 res.render 직전에 로깅하려고 시도했지만 undefined입니다. 우리 그룹의 학생들은 지금까지 약속을 잘 모르며, 그래서 우리는 뭔가를 놓치고 있습니다. 어쨌든 여기 내 코드, 어떤 도움 ?? 고맙습니다. 당신은 올바른 방법으로 Promise 사용하지 않는이 약속의 가치를 되 찾으십시오.

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

'userData'는 하늘의 배열은? – guest271314

+0

실제로 나는 방금 대답을 찾았습니다. 게시 죄송합니다. res.render 바로 전에 변수에서 함수를 호출 한 다음 이동할 수 있습니다. – pkerckho

+0

질문에 대한 답변을 얻었습니까? – jfriend00

답변

0

는 점에서 반환처럼 아무것도 없다. 코드의 예는

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

를 사용하여, 그것은 많은 나에게 명확하지 않았다 것을 호출 할 수 있도록 위의 코드는 방법에 짧은 버전입니다 제대로 약속을 사용하고 데이터를 다음으로 전달합니다. 또한 오류가있을 경우 항상 catch을 사용하십시오.

위의 코드에서 else 사례는 호출하고 오류를 인쇄하고 Some error detected을 인쇄합니다. 여기

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

것 같습니다. 나는 당신에게 다음과 같은 개선점을 제공하는 더 깔끔한 방법을 보여줄 것이라고 생각했다.

  1. 모든 if/else 절을 ​​찾아보기 테이블로 교체한다.
  2. userData을 상위 범위의 변수로 설정하려고하는 부작용 프로그래밍을 제거하여 나중에 다시 선택할 수 있도록하십시오.
  3. 약속에서 둘 이상의 값을 반환하는 방법 (개체에 래핑하여).

코드 :

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") 
    }); 
}); 
관련 문제