Node.js 异步调用的承诺和条件
我正在使用Node.js和AWS DynamoDB(Node.js 异步调用的承诺和条件,node.js,asynchronous,promise,es6-promise,Node.js,Asynchronous,Promise,Es6 Promise,我正在使用Node.js和AWS DynamoDB(AWS sdk)实现我的服务 我不清楚如何通过承诺实现以下场景: 我收到一个修改具有指定属性的实体的请求 我试图在数据库中查找实体(异步调用find) 如果找不到实体,则创建一个初始状态的实体(异步调用createInitialStateObject) 根据特定规则(异步调用applyModifications)修改实体(在步骤3之前或刚刚创建的数据库中) 这是我第一次尝试: function scenario(params) { fi
AWS sdk
)实现我的服务
我不清楚如何通过承诺实现以下场景:
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
});
}
但这里的缺陷是,创建可能发生在修改之前,它不一定会一个接一个地发生
另一种尝试有效,但看起来有点奇怪。我创建了一个空承诺,以在对象已存在时调用:
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
});
}
如何以正确的方式实现它?创建“空”或同步。承诺并不罕见。实现这一点的方法甚至很短:
Promise.resolve(value)
立即创建并解析承诺
除此之外,你应该利用适当的链接和停止嵌套的东西这么多。一旦你进入了一个链,你甚至不需要解析一个空的承诺,因为一个非thenable对象的返回值被解释为正是这样
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
}
不可编辑对象的返回值
相当于返回Promise.resolve(值)代码>-因为根据。那么
必须返回承诺