javascript - 几乎所有地方都可以使用 async/await 吗?

标签 javascript node.js async-await ecmascript-next

我目前正在编写供个人使用的小型 NodeJS CLI 工具,我决定尝试使用 Babel 的 ES7 async/await 功能。

它是一个网络工具,所以我显然有异步网络请求。我为 request 包写了一个简单的包装器:

export default function(options) {
    return new Promise(function(resolve, reject) {
        request({...options,
            followAllRedirects: true,
            headers: {
                "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"
            }
        }, (error, response, body) => {
            if(error) {
                return reject(error);
            }
            resolve({response: response, body: body});
        });
    });
}

现在我可以做类似的事情了

async function getGooglePage() {
    try {
        var r = await request({url: "http://google.com"});

        console.log(r.body);
        console.log("This will be printed in the end.")
    } catch(e) {
        console.log(e);
    }
}
getGooglePage();

现在我有一个问题:我在很多地方做请求,我必须将所有这些功能标记为 async,这是一个好的做法吗?我的意思是我代码中的几乎每个函数都应该是 async,因为我需要 await 来自其他 async 函数的结果。这就是为什么我认为我误解了异步/等待概念。

最佳答案

async/await 有时被称为“传染性”或“病毒式”(或者在 C# 世界中如此),因为为了使其有效,它需要在调用链的整个过程中得到支持。强制某些异步行为同步可能会导致意想不到的结果,因此您应该将其从原始方法一直扩展到使用它的顶级消费者。换句话说,如果您创建或使用一个使用它的类型,该类型也应该实现它,依此类推。所以是的,您应该将异步添加到本身依赖它的每个函数。但是请注意,您不应该先发制人地向实际上并未实现或不需要它的函数添加异步。

想一想:如果您使用async(我的意思是通过await),您就是async。避免将 async 调用压缩为同步调用。

关于javascript - 几乎所有地方都可以使用 async/await 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35380162/

相关文章:

javascript - 使用 await 调用/申请/绑定(bind)

javascript - 将 javascript 拆分为多个文件

javascript - 使用下划线通过 ObjectId 过滤 mongodb 对象结果

.net - 为什么 async 的返回类型必须是 void、Task 或 Task<T>

c# - 为什么这些 C# 异步方法不执行过去的 Task.Delay()?

javascript - 平滑滚动不起作用,为什么?

javascript - 为什么从 Asar 复制的文件是只读的?

javascript - 在 Node JS 应用程序中实现单例 mongoDB DB 对象

node.js - 使用 Where 和 Include 失败的 Sequelize 查询

javascript - Discord.js - 尝试等待异步进程并允许包装器的递归调用