【发布时间】:2017-12-08 01:23:38
【问题描述】:
Promise 让我很反感的是,resolve 和 reject 很难掌握。还需要为 Promise 包装是丑陋的。除非你经常使用它,否则我会随着时间的推移忘记如何使用它们。此外,带有Promise 的代码仍然很混乱且难以阅读。因此我根本不喜欢使用它——因为它与回调地狱没有太大区别。所以我认为使用 ES7 await,我可以避免使用 Promise 并让我对 JavaScript 更有信心,但似乎并非如此。例如:
const getOne = async () => {
return Weather.findOne(options, function(err, weather) {
//
});
}
const getWeather = async () => {
const exist = await getOne();
if (exist == null) {
return new Promise(function(resolve, reject) {
// Use request library.
request(pullUrl, function (error, response, body) {
if (!error && response.statusCode == 200) {
// Resolve with the data.
resolve(body);
} else {
// Reject with the error.
reject(error);
}
});
});
}
}
const insertWeather = async () => {
try {
const data = await getWeather();
} catch (err) {
res.set('Content-Type', 'application/json');
return res.status(200).send('Error occurs: ' + err);
}
}
insertWeather();
request(pullUrl, function (error, response, body) {} 是来自 request nodejs 包的 AJAX 调用。
我必须用Promise 包装它 - 但不要在它前面加上await。理想情况下,这就是我的想象:
return await request(pullUrl, function (error, response, body) {...}
但如果我这样做,我将得到 request object 作为回报,而不是从 request 包返回的 data - 在这一行:
const data = await getWeather();
有什么想法或解决方案可以避免在上述情况下使用Promise?
【问题讨论】:
-
仅供参考,有一个名为 request-promise 的流行库可以为您省去麻烦:npmjs.com/package/request-promise
-
你不能用 await 替换 Promise,因为 async/await 是与 Promise 一起工作的语法糖。您可以承诺请求包或使用一些基于生成器的协程库来处理节点样式回调(但后者会更难掌握)
-
Promise 本身是基于回调的。它们与“回调地狱”的不同之处在于嵌套是相当有限的。所以不,没关系,应该和
await一起使用,而不是被它取代。在 Node 8 中已经有 nodejs.org/api/util.html#util_util_promisify_original,并且大多数主要的 Node 库都有承诺的包。
标签: node.js express mongoose promise ecmascript-2017