首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript承诺混淆反模式?

JavaScript承诺混淆反模式?
EN

Stack Overflow用户
提问于 2020-08-14 08:52:24
回答 4查看 297关注 0票数 7

我花了一整天的时间想弄清楚我是否错误地使用了承诺。

这是反模式吗?

代码语言:javascript
运行
复制
export const myExample = (payload) => {
  return new Promise((resolve, reject) => {})
}

我能用异步实现这样的承诺吗?

代码语言:javascript
运行
复制
export const myExample = (payload) => {
  return new Promise(async (resolve, reject) => {})
}

这也是错误的吗?假设添加异步在默认情况下使其成为一个承诺,

代码语言:javascript
运行
复制
export const myExample = async (payload) => {
  return new Promise((resolve, reject) => {})
}

另外,如果是这样的话,我是否应该从与解析相同的函数返回,如果我抛出错误将被拒绝,那么应该是这样吗?

代码语言:javascript
运行
复制
export const myExample = async (payload) => {
  if(payload) return true
  else throw new Error('Promise rejection?')
}

那么第一次和最后一次是一样的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-14 09:12:07

代码语言:javascript
运行
复制
export const myExample = (payload) => {
  return new Promise((resolve, reject) => {})
}

应该只用于将不基于承诺但异步返回结果的代码转换为允诺。

代码语言:javascript
运行
复制
export const myExample = (payload) => {
  return new Promise(async (resolve, reject) => {})
}

async已经创建了一个函数来返回一个承诺,而您在这里打破了承诺链。

代码语言:javascript
运行
复制
export const myExample = async (payload) => {
  return new Promise((resolve, reject) => {})
}

与第一个相同,new Promise只用于将不基于承诺但异步返回结果的代码转换为允诺。如果可以提交async,则取决于该函数中的其他代码。但是,如果您需要使用new Promise((resolve, reject) => {}),那么封闭函数应该只包含并返回new Promise,就像在第一个示例中那样。

另外,如果是这样的话,我是否应该从与解析相同的函数返回,如果我抛出错误将被拒绝,那么应该是这样吗?

票数 3
EN

Stack Overflow用户

发布于 2020-08-14 09:22:46

这是一个很好的问题,我也面临着这样的困惑,我想知道在哪里使用什么样的结构。想出了这个:

异步/等待--我在高级别使用它,主要是编写处理部分。

代码语言:javascript
运行
复制
async function asyncExample() {
  try {
    const sampleData = await otherFunction();
    // You code here
  } catch (err) {
    // Your error handling here
  }
}

在异步/等待中使用try/catch总是一个好主意

使用新的承诺(解决,拒绝)的概念。当我必须包装一个只支持回调的函数时,我通常使用它。

代码语言:javascript
运行
复制
function promiseExample() {
  return new Promise((resolve, reject) => {
    // your code to resolve()
    // otherwise to reject()
  });
}

但是有一个很好的模块promisify,它有时是一个比包装每个函数更好的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2020-08-14 09:12:03

这不是反模式,您需要使用解析函数(例如resolve(payload+'concatenate') )对承诺中的有效负载参数执行一些逻辑操作,还应该根据有效负载参数实现拒绝函数。

代码语言:javascript
运行
复制
 export const myExample = (payload) => {
      return new Promise((resolve, reject) => {})
    }

您不应该使用异步等待一旦定义了一个承诺,这些承诺只能在调用/执行承诺时使用。

代码语言:javascript
运行
复制
export const myExample = (payload) => {
  return new Promise(async (resolve, reject) => {})
}

这个代码片段也是如此。

代码语言:javascript
运行
复制
export const myExample = async (payload) => {
  return new Promise((resolve, reject) => {})
}

您应该在函数中使用await,因为您使用的是异步关键字,而且在代码段中也没有定义承诺,所以在使用异步等待之前一定要定义它们,因此您将能够返回一些值或抛出一个错误。

代码语言:javascript
运行
复制
export const myExample = async (payload) => {
  if(payload) return true
  else throw new Error('Promise rejection?')
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63409563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档