【问题标题】:How can I avoid using another promise in my case?在我的情况下如何避免使用另一个承诺?
【发布时间】:2020-01-07 15:30:02
【问题描述】:

我有两个 .js 文件,例如:

index.js:

app.get("/testing", (req, res) => {
  testAsyncFunction().then((resolvedData) => {
    res.send(resolvedData);
  });
})

和 server.js:

const asyncFunction = () => {
  return new Promise((res) => {
    setTimeout(() => {
      res('resolved');
    },3000 )
  })
}

const testAsyncFunction = () => {
  return new Promise(async (res) => {
    const result = await asyncFunction();
    return res(result);
  })
}

这是按预期工作的,但如果我将 testAsyncFunction(这样我不会创建新的承诺)更改为这样的:

const testAsyncFunction = async () => {
  const result = await asyncFunction();  
  return result;
}

在 index.js 中:

app.get("/testing", (req, res) => {
  res.send(testAsyncFunction());
})

我得到一个空对象,因为它没有等待 3 秒,在后一种情况下我错过了什么?我想避免创建一个新的 Promise 只是为了等待另一个 Promise。

更新

我把 testAsyncFunction 改成这样:

const testAsyncFunction = () => {
  asyncFunction().then((result) => {
    return result;
  })  
}

即使上面的功能。不是异步函数,为什么我仍然必须在index.js 中等待它。我假设在这种情况下返回的值不会是一个承诺,所以这就是我感到困惑的部分。

【问题讨论】:

  • 我认为在这种情况下,您无法避免在app.get() 回调中“创建另一个承诺”。您可以使用 async/await 隐藏它。
  • @RameshReddy async 总是将你的返回值包装成一个承诺
  • 如果我每次重复这句话都能得到五分钱,我会很富有 - "Everyasync 函数返回一个承诺。你必须使用.then()await 在来自 async 函数的返回值上以获取解析值。"
  • 一旦在函数的任何地方异步获得结果(如通过promise),那么将其返回给调用者的唯一方法就是异步(通常通过promise)。您可以直接返回承诺或使用async 函数并让 JS 为您做出承诺。但是,无论哪种方式,您都将返回一个 Promise,而调用者将使用 .then()await 从 Promise 中获取值。这就是异步代码和承诺在 Javascript 中的工作方式。
  • @jfriend00 “将它返回给调用者的唯一方法是异步(通常通过承诺)”这终于消除了我的疑问。我希望你能找到大量的镍币并变得富有。

标签: javascript promise es6-promise


【解决方案1】:

so that I don't create a new promise 应该是这样,否则就是反模式。然而,当一个函数返回一个 Promise 时,你需要等待同样的结果

app.get("/testing", async (req, res) => {
  let obj = await testAsyncFunction()
  res.send(obj );
});

app.get("/testing", (req, res) => {
  testAsyncFunction().then((obj) => {
    res.send(obj );
  })
});

【讨论】:

  • 你能告诉我使用'.then'或'await'的原因吗,即使我没有使用异步函数?正如我在问题中更新的那样。
  • 您更新后的代码将不起作用asyncFunction().then((result) => { 应返回。 return asyncFunction().then((result) => {
【解决方案2】:
const testAsyncFunction = async () => {
  const result = await asyncFunction();  
  return result;
}

async 函数总是返回承诺。所以这相当于:

const testAsyncFunction = () => {
  return asyncFunction();  
}

我想避免创建一个新的 Promise 只是为了等待另一个 Promise。

所以只需使用现有的承诺:

app.get("/testing", (req, res) => {
  asyncFunction().then((resolvedData) => {
    res.send(resolvedData);
  });
})

const asyncFunction = () => {
  return new Promise((res) => {
    setTimeout(() => {
      res('resolved');
    },3000 )
  })
}

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多