【问题标题】:Creating a promise from code that uses await从使用 await 的代码创建一个 Promise
【发布时间】:2018-11-13 14:14:35
【问题描述】:

我想使用 await 语法编写一段代码,立即执行它,并创建一个等待执行完成的 Promise。我想出了以下方法来做到这一点。

let makePromise = async () => {
    return foo && await bar();
}
let promise = makePromise();

但是,我发现这很难阅读和理解。创建一个函数然后立即调用它似乎违反直觉,并且违背了其他编程语言的良好实践。有没有更惯用的方式来编写这段代码?

特别是,此代码用于以下上下文。

let promises = items.map((item) => {
    let makePromise = async () => {
        return foo(item) && await bar(item);
    }
    return makePromise();
});

【问题讨论】:

  • 这是唯一的方法。为什么不将临时功能提升到模块级别,并根据其职责和业务价值为其命名呢?一般来说,将您的代码拆分为多个具有深思熟虑的名称的函数被认为是一种很好的做法。
  • 异步函数实际上返回了一个承诺。 const x = async () => {console.log(123)}; x.then(() => console.log(456))
  • 你应该像这样在makePromise() 尝试awaiting:let makePromise = async () => { return foo && bar(); } let promise = await makePromise();
  • @TamasHegedus 通常这可能是正确的,但在我的情况下并非如此。我将在问题中添加一些上下文,以明确为什么您的解决方案不适用于我的情况。这也可能更容易回答这个问题。

标签: node.js promise async-await


【解决方案1】:

异步函数实际上返回一个 Promise。这是有效的:

const x = async () => {
  console.log(123)
}

x().then(() => {
  console.log(456)
})

所以在你的情况下:

let promise = bar()

【讨论】:

    【解决方案2】:

    为什么不直接使用异步函数呢?以下代码的行为与您的示例完全相同,但请记住,这会产生一组承诺,而awaits 没有一个。

    function foo(x) { return "foo " + x; }
    async function bar(x) { return "bar " + x; }
    const items = [1];
    
    let promises = items.map(
        async item => foo(item) && await bar(item)
    );
    
    Promise.all(promises).then(x => console.log(x));

    【讨论】:

    • 是的。我的个人经验教训:当我最终得到这样的代码时,我可能应该尝试查看周围的代码,看看我是否可以将异步声明“移到更远”,就像在这种情况下到地图回调一样。
    • 你也可以在网上找到.map函数的异步版本,所以最终你可以拥有与旧的同步版本非常相似的顺序执行和控制流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多