2017-05-16 189 views
1

我使用的承諾,我堅持一個問題,這更多的是最佳實踐的問題。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); 
    } 
    }); 
} 

實際的代碼第三行,它不是一個普通的對象,而是一個解析爲一個的承諾。 因此,驗證不起作用,只是剝奪了一切...

+3

*「不過,我不能只是使用它們鏈接這些功能,如「*這應該工作。你在使用本地承諾嗎? –

+1

從回傳到'then'的回調中返回一個承諾將解決該承諾下的承諾,所以你在那裏的代碼應該工作。 – nem035

+0

如果你這樣做會發生什麼,而不是'console.log','console.log.bind(console)'? – josh

回答

-3

這個怎麼樣?

validate(req.body, bodyValidationSchema) 
.then(validated_data => { 
    return db.model.create(validated_data, other_parameters); 
}) 
.then(console.log) 
+1

這是相同的代碼。 –

1

嗯,對不起,但最終我錯誤地將一個Sequelize Model實例誤認爲Promise。 我並沒有承諾在給定的參數,因此一切都很好,我只是不得不採取平原對象從實例

email.nodeValues 

謝謝大家誰幫助