2017-10-01 2 views
0

비동기 함수에 문제가 있습니다. mongob에 질의 (mongoose 사용)를하고 있는데 정보를 다시 얻으려고하면 정의되지 않은 결과가 나옵니다./내 비동기 기다리고있어 여기비동기/대기 함수가 정의되지 않음에서 생성됩니다.

function kquery() { 
    Krakentick.findOne(
    { 
     iname: 'btcusd', 
     n: { $lt: now } 
    }, 
    'mk c n', 
    function(err, tick) { 
     if (err) { 
     return console.log(err); 
     } else { 
     return tick; 
     } 
    } 
); 
} 

과 기능 :

여기 (함수 내에서 중첩) DB를 내 쿼리

async function compare() { 
    var ktick = await kquery(); 
    console.log(ktick); 
} 

compare(); 

이 기능

는 모두 동일한 파일에있는, 때 나는 그것에게 나를 'undefined'를 준다 그것을 달린다. 난 그냥 쿼리 기능을 실행하고 return tick 대신 console.log(tick)을두고 때 동안, 나는 정확한 정보를 얻을 :

{ _id: 59d1199cdbbcd32a151dcf21, 
    mk: 'kraken', 
    c: 430900, 
    n: 1506875804217 } 

내가, 내가 어딘가에 콜백 엉망 있다고 생각을하지만 난 아니에요 어디서 어떻게. 당신의 도움을 사전에

const mongo = require('mongodb'); 
const mongoose = require('mongoose'); 
mongoose.Promise = global.Promise; 
const server = mongoose.connect('mongodb://localhost/cryptoCollection', { 
    useMongoClient: true 
}); 

//Loading the mongoose schema: 
const { Krakentick } = require('./kraken/model/krakenModel'); 
var now = Math.floor(new Date()); 

function kquery() { 
    Krakentick.findOne(
    { 
     iname: 'btcusd', 
     n: { $lt: now } 
    }, 
    'mk c n', 
    function(err, tick) { 
     if (err) { 
     return console.log(err); 
     } else { 
     return tick; 
     } 
    } 
); 
} 


async function compare() { 
    var ktick = await kquery(); 
    console.log(ktick); 
} 

compare(); 

감사 : 다음은 전체 파일입니다!

+2

나는 단지 "에 읽었고 여기에 내 async/await 함수가 있습니다 :"_ 그 함수가 실제로'undefined'를 반환하기 때문에 .... Soooo .... 질문은 무엇입니까? 함수가 무언가를 반환해야한다면, 무언가를 반환하도록해야합니다. 아니면 반환 값이 아닌 로그 출력을 의미합니까? 'kQuery'를 기다릴 수는 없습니다. 아무 것도 반환하지 않습니다! 기다릴 약속이 없습니다! 'wait' 문은 즉각적인'undefined' 리턴 값을 "기다린다". 'Krakentick.findOne '앞에서'return'을 잊어 버린 것 같습니다. 함수가 약속을 되 돌리거나 도움이되지 않기를 바랍니다. –

+2

[비동기 호출의 응답을 반환하려면 어떻게합니까?] (https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Frxstrem

+0

안녕하세요. 내 'kquery()'함수 내부에서 틱을 반환해야하는 비동기/대기 함수에'비교 '가 기록되도록하기 위해'return tick;이 아닌가? – Ardzii

답변

3

약속 반환해야합니다 kquery 기능 :

function kquery() { 
    return Krakentick.findOne(
    { 
     iname: 'btcusd', 
     n: { $lt: now } 
    }, 
    'mk c n', 
    function(err, tick) { 
     if (err) { 
     return console.log(err); 
     } else { 
     return tick; 
     } 
    } 
); 
} 
0

그냥 참조를 위해 promesified kquery 기능을 게시 :

function kquery() { 
    return new Promise((resolve, reject) => { 
    Krakentick.findOne(
     { 
     iname: 'btcusd', 
     n: { $lt: now } 
     }, 
     'mk c n', 
     function(err, tick) { 
     if (err) { 
      reject(err); 
     } else { 
      resolve(tick); 
     } 
     } 
    ); 
    }); 
} 

을 허용 대답했다가 논의 이전에 문서화되었다하더라도 위의 하나 Mörre의 코멘트에서! 누군가를 돕기 위해 거기에두고 싶었어!

귀하의 소중한 도움에 다시 한 번 감사드립니다!