gpt4 book ai didi

node.js - 异步调用的 promise 和条件

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:35 25 4
gpt4 key购买 nike

我正在使用 Node.js 和 AWS DynamoDB (aws-sdk) 来实现我的服务。

我不清楚如何使用 Promise 实现以下场景:

  1. 我收到修改具有指定属性的实体的请求
  2. 我正在尝试在数据库中查找实体(异步调用 find)
  3. 如果未找到实体,则创建一个具有初始状态的实体(异步调用 createInitialStateObject)
  4. 根据特定规则修改实体(之前位于数据库中或刚刚在第 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
});
}

但这里的缺陷是创建可能发生在修改之前,而不一定会相继发生。

另一种尝试有效,但看起来有点奇怪。我创建一个空的 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
});
}

应该如何以正确的方式实现?

最佳答案

创建“空”或同步。 promise 并不罕见。甚至还有一种简短的方法可以做到这一点:Promise.resolve(value) 立即创建并解析 Promise。

此外,您应该使用适当的链接并停止过多的嵌套。一旦进入链中,您甚至不需要解析空的 Promise,因为不可 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
}

关于node.js - 异步调用的 promise 和条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40937754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com