2017-09-08 12 views
1

비동기 함수의 값을 가져와야합니다. 나는 약속을 사용하려고하지만 작동하지 않습니다 : 내가 얻을JS : Promise가 값을 반환하지 않습니다.

const res = new Promise(function (resolve, reject) { 
    gm(readStream).size({ bufferStream: true }, function (err, size) { 
    if (!err) resolve(size) 
    }) 
}) 
console.log(res) 

결과는 Promise { <pending> }

+2

약속을 사용한다고해서 코드가 동기화되는 것은 아닙니다. 'res.then (function (ret) {console.log (ret);})' – Keith

+6

@adeneo에서 냉소적 일 필요는 없습니다. 너는 초보자였다. –

+1

글쎄, 약속, 비동기/대기 및 콜백을 실제로 사용했는지에 대한 질문을하기 전에 무작위 질문을 복사/붙여 넣기하지 않는 한 비동기가 무엇인지 명확하게 알 수 있습니까? – adeneo

답변

6

약속 콜백에 대한 추상화가 아닌 마법이다입니다. 비동기 코드를 동기식으로 만들 수는 없습니다.

올바른 솔루션입니다 : 당신이 NodeJS (버전 8 이상)를 사용하는 경우, 당신은 적응 할 수있을 것,

const getSize = readStream => { 
    return new Promise(function (resolve, reject) { 
    gm(readStream).size({ bufferStream: true }, function (err, size) { 
     if (err) reject(err); 
     else resolve(size); 
    }) 
    }); 
} 


let printSize = async readStream => { 
    console.log(`Size is ${await getSize(readStream)}`); 
} 

을 또는 :

const res = new Promise(function (resolve, reject) { 
    gm(readStream).size({ bufferStream: true }, function (err, size) { 
    if (err) reject(err); 
    else resolve(size); 

    }) 
}); 

res.then(function(promiseResolutionValue) { 
    console.log(res) 
}) 

또한 여기 async/await을 사용할 수 있습니다 귀하의 기능은 util.promisify입니다.
Bluebird과 같은 다른 Promise 라이브러리도 '표준'노드 스타일 함수 (인수로 err, data와 콜백을 가진 함수)를 약속 반환 함수로 쉽게 변환 할 수있는 함수를 제공합니다.

아니면 콜백 만 사용하십시오.

+0

당신이 더 좋았을 수도 있지만 이것이 올바른 대답이라고 생각합니다! –

+0

당신은 또한 'async' /'await'을 예제에 추가 할 수 있습니다. 어떤 종류의 것은 마술이고 어떤 종류의 _make 비동기 코드 synchronous를 수행 할 수 있습니다. – msanford

+0

나는 그것이 무언가 무례하다는 것을 의미하지 않았습니다. – nadavvadan

0

귀하의 코드는 다음과 같이보고한다 :

const res = new Promise(function (resolve, reject) { 
    gm(readStream).size({ bufferStream: true }, function (err, size) { 
    if (!err) resolve(size) 
    else reject(err) 
    }) 
}) 

function onResolved(data) { 
    console.log('data: ', data); 
} 

function onRejected(err) { 
    console.log('err:', err); 
} 

res.then(onResolved, onRejected); 

약속이 코드 동기가되지 않습니다, 당신이하지 즉시 callback 스타일과 같은 결과를 얻을 할 때 제어 할 수 있습니다.