2016-08-27 5 views
0

나는 NodeJS를 처음 사용하고 Promise가 어떻게 작동하는지 이해하려고 몇 시간을 소비 한 후에도 쉬운 일이 아닌 것처럼 보입니다.NodeJS 약속 - "Then"이 호출되지 않음

나는 데이터베이스에 몇 차례 전화를 걸려고하는데, 일단 모든 호출이 완료되면 다른 것을하십시오. 지금 가지고있는 것은 다음과 같은 코드이지만, then 함수는 호출되지 않습니다.

var queries = ['SELECT value FROM tag', 'SELECT url FROM download_link']; 
console.log("Starting promises"); 
var allPromise = Promise.all([queryDatabaseAddToResult(connection, queries[0], result), queryDatabaseAddToResult(connection, queries[1], result)]); 
    allPromise.then(
    function(result) { 
     console.log("1"); // Does not show up 
    }, function(err) { 
     console.log("2"); // Does not show up either 
    } 
); 

function queryDatabaseAddToResult(connection, query, result) { 
    return new Promise(function(resolve, reject) { 
    connection.query(query, function(err, rows, fields) { 
     if (err) { 
     console.log(err); 
     Promise.reject(err); 
     } 
     console.log(rows); 
     result.tags = JSON.stringify(rows); 
     Promise.resolve(result); 
    }); 
}) 

} 데이터베이스에

호출은 행이 로그에 표시 로그인으로 만들어합니까.

답변

7

문제는 올바른 resolvereject 함수를 호출하지 않는 것입니다. 그것은해야 다음 resolvereject 통화가 하지Promise.로 범위해야한다는

function queryDatabaseAddToResult(connection, query, result) { 
    return new Promise(function(resolve, reject) { 
    connection.query(query, function(err, rows, fields) { 
     if (err) { 
     console.log(err); 
     reject(err); 
     } else { 
     console.log(rows); 
     result.tags = JSON.stringify(rows); 
     resolve(result); 
     } 
    }); 
}) 

참고. 그리고 reject을 호출하면 else을 사용하여 resolve으로 전화하지 않아야합니다.

0

당신은 이런 식으로 할 필요가 :

var promise1 = queryDatabaseAddToResult(connection, queries[0], result); 
var promise2 = queryDatabaseAddToResult(connection, queries[1],result); 
Promise.all([prromise1, promise2]).then(result => { 
    console.log(1); 
}).catch(err => { 
    console.log(err); 
}); 
+0

결과 및 연결 변수를 이미 정의했다고 가정했습니다. –

0
return Promise.reject() //no need to add else part 
관련 문제