我使用的承諾,我堅持一個問題,這更多的是最佳實踐的問題。ES6嵌套承諾
我有,它返回一個承諾解析成一個對象(驗證對象)的函數:
validate(req.body, bodyValidationSchema)
我有另一個功能,從所述驗證的數據在數據庫中創建一個對象,並返回一個承諾解析成創建的對象:
db.model.create(validated_data, other_parameters)
然而,我不能只是連鎖使用它們的那些功能,例如:
validate(req.body, bodyValidationSchema)
.then(validated_data => db.model.create(validated_data, other_parameters))
.then(console.log)
因爲,最後一行不會打印created_object,而是一個Promise解析到創建的對象中。 因此,我必須做這樣的事情,嵌套的承諾:
validate(req.body, bodyValidationSchema)
.then(validated_data =>
db.model.create(validated_data, other_parameters)
.then(console.log)
)
有沒有什麼更好的方法來做到這一點? 此外,如果我通過異步任務替換console.log,並在該任務之後添加另一個「.then()」,但在更大的後面,它不會等待最後一個任務(我不知道這是否是很清楚...)
非常感謝你, Giltho
編輯:這裏是顯示如果我嘗試打印的「郵件」問題
function createEmailView(req, res) {
validate(req.body, emailCreationSchema)
.then(validatedBody =>
db.Email.create({ email: validatedBody.email, userLogin: req.user.login }))
.then(email => validate(email, emailSchema, { stripUnknown: true }))
.then((validatedEmail) => { console.log(validatedEmail); return validatedEmail; })
.then((validatedEmail) => {
res.status(201).json(validatedEmail);
})
.catch((error) => {
if (error instanceof Sequelize.ValidationError || error.isJoi) {
res.status(400).json(makeStandardErrorOfValidationError(error));
} else {
res.status(500).json(error);
}
});
}
實際的代碼第三行,它不是一個普通的對象,而是一個解析爲一個的承諾。 因此,驗證不起作用,只是剝奪了一切...
*「不過,我不能只是使用它們鏈接這些功能,如「*這應該工作。你在使用本地承諾嗎? –
從回傳到'then'的回調中返回一個承諾將解決該承諾下的承諾,所以你在那裏的代碼應該工作。 – nem035
如果你這樣做會發生什麼,而不是'console.log','console.log.bind(console)'? – josh