我目前正在编写供个人使用的小型 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/