代码之家  ›  专栏  ›  技术社区  ›  cib

从使用await的代码中创建承诺

  •  2
  • cib  · 技术社区  · 6 年前

    我想使用await语法编写一个代码块,立即执行它,并创建一个等待执行完成的承诺。我想出了下面的方法。

    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();
    });
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Tamas Hegedus    6 年前

    为什么不直接使用异步函数?以下代码的行为与您的示例完全相同,但请记住,这会产生一系列的承诺和 await 都不是。

    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));
        2
  •  0
  •   lipp    6 年前

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

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

    所以在你的情况下:

    let promise = bar()