【发布时间】:2019-01-10 18:16:59
【问题描述】:
编辑 - 虽然答案包含几个可行的解决方案,但我会指出 Parse JS SDK 2.0(以及因此 Parse-Server 3.0)已经发布,并且实际上删除了 Parse.Promise。因此,最好的解决方案是更换 Parse Promise 实现并改用本机 Promises。
我使用 Parse-Server(最新版本,2.8.2)作为后端。我非常习惯于 promise,它们在我的代码中根深蒂固。
不过,我已经开始改用 async / await 模式了。但它与我现有的所有实现都不能很好地配合。
这个例子会报错:
const promiseErrorTestHelper = async () => {
return Parse.Promise.as();
}
Parse.Cloud.define('promiseErrorTest', async(req, res) => {
promiseErrorTestHelper().always(
res.success
);
});
这个很好用:
const promiseErrorTestHelper = async () => {
return Parse.Promise.as();
}
Parse.Cloud.define('promiseErrorTest', async(req, res) => {
promiseErrorTestHelper().then(
res.success
);
});
在 Parse-Server 中,.always() 用于传递回调函数,无论 promise 被拒绝还是已解决。我在整个代码中都使用了它,并在重构某些函数以在添加新功能时使用 async / await 时发现了这个问题。
我理解问题在于异步函数将其结果包装在一个 Promise 中。所以,它把我的Parse.Promise 转换为没有.always() 方法的不同类型。
我是否有一种简单的方法可以覆盖异步的功能以返回 Parse.Promise 呢?或者,如果我想使用 async / await,我是否必须重新处理 always() 调用?
【问题讨论】:
-
也许在
async函数返回的内置promise中添加一个.always()方法。Promise.prototype.always = function(fn) {...}. -
此外,无论承诺解决还是拒绝,您的许多处理都完全相同是不寻常的。所以,这让我觉得如果你一直使用
.always(),你可能没有正确使用resolve和reject。 -
看起来没有任何方法可以更改
async函数返回的承诺类型。这是硬连线到 Javascript 中的。您可以使用包装器包装从您的async函数返回的本机承诺,该包装器将其转换为另一种类型的承诺,但是这会将代码添加到您想要使用的每个await。 -
仅供参考,这里有一个类似的讨论,关于人们试图让
async函数从 Bluebird 承诺库返回承诺:github.com/petkaantonov/bluebird/issues/1434。结论 - 如果不将返回的承诺包装在另一个承诺中,就无法做到这一点。 -
@jfriend00 非常感谢您做一些研究!您首先提到的是我希望我能够做到的事情,遗憾的是我无法掌握异步返回的内容。这不是我们使用
always的核心功能。例如,向我们发送有关活动的警报消息或 ping 我们的事件服务器以跟踪事件。在完成所有数据库更新后,我不想停止函数,因为我的事件 ping 不知何故失败了。我知道这不是理想的解决方案,但对我们来说很快。它只是与 async/await 不兼容。
标签: node.js promise async-await parse-server