2016-11-19 5 views
-2

私はここでこれに対する答えを見つけようと多くの時間を費やし、何も出てこないようにしました。Javascript:非同期コールバック関数(MongoClient)のデータを利用する

データベースへの非同期呼び出しを行い、コールバック関数でデータを返すコードがあります(私の場合は、MongoClientを使用してプロミスを返します)。しかし、結果のデータを実際に関数レベル変数を設定するために使用する方法を考えることはできません。ログを作成しようとするたびに、ログには未定義または未定義のPromiseオブジェクトが記録されます。

このトピックには多くの記事がありますが、適用しようとすると動作するメソッドが見つかりません。どんなすべての援助が喜んで受け入れられました!

function lookupOneDbEntry(key, value) { 

    var responseData = "initial data" 

    // search for the entry in the database 
    db.collection("my_collection").findOne({key: value}, function(err, result) { 
     if (err) { 
     //if database throws an error 
     responseData = "db error"; 
     } 
     else { 
     // if the entry is found, return the data 
     responseData = result; 
     } 
    }); 

    return responseData; 

    } 

EDIT:徹底的なドキュメントがある程度に有用であるが、私は、この1 hereように(この上の他の記事を認識していと; mはのような実際の実装では、実質的にこの情報を使用して問題が発生しました上記1。したがって、ここで私の質問。

+1

可能な重複http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchronous-call) – Andreas

+0

あなたが本当にリンクしている質問には、必要なすべての情報があります。 Kling氏の答えは、さまざまな状況に応じた豊富な説明とさまざまな解決策を持っています。 – Pointy

+0

Promiseをどのように使用しようとしているかを示すことはできますか? – Victory

答えて

0

非同期では、現在のスタックにそれを返すことができません。あなたがオンになっているコールスタックの外側で起こる呼び出します。

だから我々は結果にフックする約束を使用電話の

function lookupOneDbEntry(key, value) { 
    return new Promise(function (resolve, reject) { 
    // search for the entry in the database 
    db.collection("my_collection").findOne({key: value}, function(err, result) { 
     if (err) { 
     //if database throws an error 
     reject(err); 
     } 
     else { 
     // if the entry is found, return the data 
     resolve(result); 
     } 
    }); 
    }); 
} 

lockupOneDbEntry('myKey', 'myValue').then(function (result) { 
    console.log('result', result); 
}, function (err) { 
    console.log("error!", err); 
}); 
+0

努力を感謝しますが、これは私のためには機能しませんでした。しかし私は約束を解決するという考えに私を置いてくれてありがとう、私はその考えに基づいて解決策をまとめることができました:) – user2521119

+0

問題はありません。それが助けになったら、アップヴォートする必要があります。解決策を見つけたら、ここであなた自身の質問に答えることができます。 – Victory

0

私は最終的にそれをやっていました。私は最終的にそれを行うことができました - 私は最後に派手なコールバックや追加の約束は必要ありませんでした。別々に。

function lookupOneDbEntry(key, value) { 

    var responseData = "initial data"; 

    var solution = db.collection("accounting_module").findOne({key: value}); 

    solution.then(function (result) { 
     // validation of result here 
     responseData = result; 
    }); 

    return responseData; 
} 
[私は非同期呼び出しからの応答を返すにはどうしますか?](の
関連する問題