【问题标题】:Is there a difference between returning a promise from async or or normal function从异步或普通函数返回承诺之间有区别吗
【发布时间】:2019-02-14 06:56:54
【问题描述】:

一段时间以来,我一直想知道 async 关键字在简单地返回一个承诺时是否不是多余的。

考虑以下几点:

async function thePromise() {
    const v = await Inner();
    return v+1;
}

async function wrapper() {
    return thePromise();
}

我一直想知道wrapper 函数,因为它不会在promise 中等待解析,所以async 关键字不是多余的吗?我们不应该只使用:

function wrapper() {
    return thePromise();
}

明显的缺点是这种格式混淆了我们使用 Promise,但除此之外:从异步函数或普通函数返回 Promise 之间有什么实际区别吗?

【问题讨论】:

  • 我认为你是对的@paul23

标签: javascript asynchronous async-await


【解决方案1】:

考虑这个简单的演示:-

var me = {
    name: 'Shivendra'
}
// promise creation
var myPromise = new Promise((resolve, reject) => {
    if (me) {
        resolve(me.name==='Shivendra')
    }
    else {
        reject(new Error("Oh no !"))
    }
}
)

function wrapper(){
    return myPromise;
}
// promise consumption
wrapper().then(res => {
    if (res) {
        console.log("Promised passed")
        console.log(me)
    }
    else {
        console.log("Promise was failed")
    }
})

【讨论】:

    【解决方案2】:

    由于javascript中没有Promise之类的Promise,所以它们是等价的

    // code 1
    promise1.then(() => {
      //...
      return promise2;
    }).then(f);
    
    // is equivalent to code 2
    
    promise1.then(() => {
      //...
      return promise2.then(f);
    });
    

    同样的事情也发生在异步函数中,从异步函数返回一个promise等同于返回等待的表达式

    // code 3
    async () => {
      // ...
      return p;
    }
    
    // is equivalent to code 4
    async () => {
      // ...
      return await p;
    }
    

    需要注意的一点是,它不适用于 promise 数组等​​。对于这些场景,您可以使用 Promise.all 包装数组,以将 Promise 数组转换为数组 Promise 或为其他数据结构编写您自己的代码。

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 1970-01-01
      • 2022-01-26
      • 2020-01-11
      • 1970-01-01
      • 2020-02-19
      • 2019-12-03
      • 1970-01-01
      • 2016-06-22
      相关资源
      最近更新 更多