目前我正在使用Node,Express和Q库进行承诺。它工作正常,但我在下面插入每个承诺得到一个可怕的厄运金字塔。
我已经检查过我可以通过以下结构避免这种情况:
function validateInputFields(formName,req){
var deferred = Q.defer()
, connection = req.conn || deferred.resolve(new Error('Internal error with connection.'));
Services.data.splitBody(req.body)
.then((arr) => {
var inputFields = arr[0]
, inputValues = arr[1];
return Services.form.getFields(connection,formName)
})
.then((formKeys) => { return Services.form.getMandatories(formKeys) })
.then((dbMandatories) => { return Services.form.allMandatoriesAreProvided(dbMandatories,inputFields) })
.then((mandatoriesProvided) => { return Services.form.allFieldsBelongToform(formKeys,inputFields) })
.then(() => {
Services.form.correctFieldsType(inputFields,inputValues,formKeys)
deferred.resolve();
})
.catch((err) => next(err));
return deferred.promise;
}
这里的问题是我无法在以下承诺中访问inputFields
之类的某些变量,而在嵌套时我能够做到这一点。
Other post建议尽管.spread
使用.then
,但它不起作用(即使承诺停止工作)。
有没有一种聪明的方法可以解决这个问题?
谢谢!