异步调用的承诺和条件
Promises and condition from async call
我正在使用 Node.js 和 AWS DynamoDB (aws-sdk
) 来实施我的服务。
我不清楚如何使用 promise 实现以下场景:
- 我收到修改具有指定属性的实体的请求
- 我正在尝试在数据库中查找实体(异步调用
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
});
}
应该如何正确实施?
正在创建 'empty' 或同步。承诺并不罕见。甚至有一个简短的方法可以做到这一点:Promise.resolve(value)
立即创建并解析一个 Promise。
除此之外,您应该使用适当的链接并停止嵌套太多东西。一旦你在一个链中,你甚至不需要解决一个空的承诺,因为一个非 thenable 对象的 return 值被解释为这个。
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
}
我正在使用 Node.js 和 AWS DynamoDB (aws-sdk
) 来实施我的服务。
我不清楚如何使用 promise 实现以下场景:
- 我收到修改具有指定属性的实体的请求
- 我正在尝试在数据库中查找实体(异步调用
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
});
}
应该如何正确实施?
正在创建 'empty' 或同步。承诺并不罕见。甚至有一个简短的方法可以做到这一点:Promise.resolve(value)
立即创建并解析一个 Promise。
除此之外,您应该使用适当的链接并停止嵌套太多东西。一旦你在一个链中,你甚至不需要解决一个空的承诺,因为一个非 thenable 对象的 return 值被解释为这个。
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
}