1
我正在使用Node.js和AWS DynamoDB實現我的服務(aws-sdk
)。來自異步調用的承諾和條件
目前還不清楚,我如何實現與承諾以下情形:
- 我得到一個要求修改的實體指定屬性的
- 我試圖發現在DB的實體(異步調用
find
) - 如果沒有找到該實體然後創建一個與初始狀態(異步調用
createInitialStateObject
) - 修改實體(根據特定的規則這是在DB之前或剛好在步驟3中創建)(異步調用
applyModifications
)
這是我第一次嘗試:
function scenario(params) {
find(params).then((data) => {
let objectExists = checkExistense(data);
if (!objectExists) {
createInitialStateObject(params).then((data) => {
console.log("Object created");
// OK
}).catch((err) => {
console.error("Object not created");
// exit and return error
});
}
applyModifications(params).then((data) => {
// OK, return data
}).catch((err) => {
// exit and return error
});
}).catch((err) => {
// exit and return error
});
}
但這裏的缺陷是,創建可以在修改之前發生的,它不是必然要發生的一個又一個。
其他嘗試的作品,但看起來有點奇怪。我創建一個空的承諾,呼籲萬一對象已存在:
function scenario(params) {
find(params).then((data) => {
let conditionalPromise = new Promise((resolve) => {
resolve(null);
});
let objectExists = checkExistense(data);
if (!objectExists) {
conditionalPromise = createInitialStateObject(params);
}
conditionalPromise.then((data) => {
applyModifications(params).then((data) => {
// OK, return data
}).catch((err) => {
// exit and return error
});
}).catch((err) => {
// exit and return error
});
}).catch((err) => {
// exit and return error
});
}
如何按正確的方式來實現?
'非thenable object'的返回值是相當於返回'Promise.resolve(值);' - 因爲根據[規格](https://promisesaplus.com/#point-40 )'然後'必須返回一個承諾 –