2017-03-13 14 views
0

私はこのような関数を持っています。これは、クエリが完了した後にスキーマを返さなければなりません。なぜこの関数が常に未定義の値を返すのか理解できません。 約束が解決しなかった後に戻る

var loadSchema = function(className) { 
 
\t var query = schemaModel.findOne({className: className}) 
 
\t var promise = query.exec() 
 

 
\t promise.then(function(schema){ 
 
\t \t console.log(schema) 
 
\t \t return schema 
 
\t }).then(null, console.log) 
 
}

私はまた、関数から全体の約束を返すようにしようとしたが、それでも私は、値を取得することはできません。この

var loadSchema = function(className) { 
 
\t var query = schemaModel.findOne({className: className}) 
 
\t var promise = query.exec() 
 

 
\t return promise.then(function(schema){ 
 
\t \t console.log(schema) 
 
\t \t return schema 
 
\t }).then(null, console.log) 
 
}

のように誰もが私にこのプログラムの流れを教えてくださいすることができます。私はstackoverflowで他の同様の質問を見てきましたが、私はこれの背後に全体のアイデアを得ることはできません。

編集: これは私がこの値を使用しているコードです。

module.exports.getSchema = function(req) { 
 
\t var className = req.params.classname 
 
\t var schema = loadSchema(className) 
 
\t console.log(schema) 
 
\t return schema 
 
}

+1

最初あなたが何も返さないので、 'undefined'を返します。あなたの2番目の例は正しいですが、私は "まだ値を得ることができません"という意味を知らない。値を使用しようとしているコードはどこにありますか? – JLRishe

答えて

1

あなたのreturn文を使用すると、.thenのパラメータとして提供関数の外に戻っています。その後、

var loadSchema = function(className, callback) { 
    var query = schemaModel.findOne({className: className}); 
    var promise = query.exec(); 

    promise.then(function(schema) { 
     console.log(schema); 
     callback(schema); 
    }).then(null, console.log); 
} 

module.exports.getSchema = function(req, callback) { 
    var className = req.params.classname 
    loadSchema(className, callback) 
} 

theModule.getSchema("req", function(schema) { 
    //do stuff 
}); 

あなたはまた、あなたの関数が約束を返す可能性があり、そしてこの周り

一つの方法は、あなたの、関数の本体内で実行されるあなたにloadSchema関数にコールバック関数を供給するので、のようなものですあなたのloadSchemaコールの後にチェーン.then秒。私はあなたのschemaModel変数が何であるかわからないが、それはの線に沿って何かだろう...

var loadSchema = function(className, callback) { 
    var query = schemaModel.findOne({className: className}); 
    var promise = query.exec(); 

    return promise; 
} 

module.exports.getSchema = function(req, callback) { 
    var className = req.params.classname 
    return loadSchema(className, callback) 
} 

theModule.getSchema("aClassName").then(...)... 

手動で生成された約束と上記のステートメントの例については、こちらを参照してください:http://plnkr.co/edit/dVRs5cmErPp0JCd5CQPU

+0

答えをありがとう。あなたの第2のアプローチを使用して、私が編集で示したような一連の機能を持っている場合、ある機能から他の機能への約束を返すべきですか? 私は約束が新しいので、もう一度感謝します。 – Tolsee

+0

同じことをmodule.exportsに適用すると、loadSchema(...)が返され、消費者はあなたが依存しないため、theModule.getSchema(...)。then(...)を実行する必要があります。 module.exports関数内で別の約束をしていれば、同じコールバックのアプローチが可能です。私はこれらのアプローチを反映するために私の答えを編集しました。一般的な約束の詳細については、こちらをご覧ください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – ryanlutgen

関連する問題