2017-03-13 68 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',因爲你沒有返回任何東西。你的第二個例子是正確的,但我不知道「仍然無法獲得價值」的含義。代碼在哪裏試圖使用該值? – JLRishe

回答

1

你return語句返回了您提供作爲.then參數的功能。解決此

一種方式是提供一個回調函數,你loadSchema功能,你那麼函數體中執行,就像這樣:

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 
}); 

你也可以有你的函數返回的承諾,然後連鎖.then s在您的loadSchema電話後。我不知道你的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

感謝您的回答。使用你的第二種方法,如果我有一些功能鏈像我在Edit中展示的一樣,我是否應該將一個函數的承諾返回給其他人? 我是新承諾,所以再次感謝。 – Tolsee

+0

你可以在你的module.exports中應用相同的東西,要麼返回loadSchema(...),然後消費者需要做的Module.getSchema(...)。然後(...),因爲你不依賴在module.exports函數內的另一個承諾上,或者您可以使用相同的回調方法。我編輯了我的答案以反映這些方法。有關一般承諾的更多信息,請參見此處:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – ryanlutgen