我使用带有AWS DynamoDB的Node.js实现我的服务(aws-sdk
)。
我不清楚如何使用promises实现以下场景:
find
)createInitialStateObject
)applyModifications
)修改实体(位于数据库之前或刚刚在步骤3中创建)这是我的第一次尝试:
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
});
}
但这里的缺陷是创造可能在修改之前发生,它不会一个接一个地发生。
另一种尝试有效,但看起来有点奇怪。我创建了一个空的promise,以便在对象已经存在的情况下调用:
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
});
}
如何以正确的方式实施?
答案 0 :(得分:2)
创建'空'或同步。承诺并非不寻常。甚至还有一个简短的方法:Promise.resolve(value)
立即创建并解决Promise。
除此之外,你应该使用正确的链接并停止嵌套这么多东西。一旦你进入一个链条,你甚至不需要解决一个空的承诺,因为非完整对象的返回值被解释为这个。
function scenario(params) {
return find(params)
.then(data => {
let objectExists = checkExistense(data);
if (!objectExists) {
return createInitialStateObject(params);
}
// if we return nothing (or null in your case) this will be the same as return Promise.resolve()
return null;
})
.then(data => applyModifications(params))
.then(data => console.log(data))
.catch(err => console.log(err));
// exit and return error
}