javascript - 与承诺作斗争 - 如何在内部然后在外部然后被调用之前做一些事情?
问题描述
不知道如何问这个问题,而且我真的在为承诺而苦苦挣扎,所以我会尝试一个简化的例子。
假设我有一个接受回调的函数。在那个函数中,我想进行一个也有回调的异步调用,所以当它的回调被调用时,我会根据它的响应做一些事情,然后调用我的回调。
someFunction = function(callback) {
var startTime = (+new Date());
someAsyncCall(function() {
var endTime = (+new Date());
callback(startTime, endTime);
});
};
该函数的作用无关紧要,因为我对事物的结构和顺序感兴趣。但是这个例子只记录了内部异步调用前后的时间,然后调用回调来报告该信息。
现在,对于我的问题,假设 someAsyncCall 已转换为 Promise,并且 someFunction 也已转换为返回该 Promise 并且不接受回调。所以,在结构上,我的函数现在看起来像这样:
someFunction = function() {
var startTime = (+new Date());
return someAsyncCall();
// How to capture endTime on then before moving on?
};
问题是,我现在想在 someAsyncCall() 之后捕获结束时间,并将这些数据记录在某处,大概是在 someAsyncCall() 的 then 条件下,在 someFunction() 的 then 条件被调用之前。我怎么做?
更新:我似乎没有得到我正在寻找的答案(或者它只是没有通过我的厚脑袋),所以也许是用这种方式陈述我的问题的更好方法:
让我们从这段示例代码开始:
startProcess = function() {
// Do a bunch of stuff here...
return doProcess(someParams);
}
最终,doProcess 返回一个promise,由startProcess 返回。然后调用者对它做任何事情。
现在,我想在 doProcess 周围包装一些代码来捕获开始和结束时间,而不会对现有代码的操作造成任何干扰。有没有什么方法可以响应 doProcess 的完成以在它解决承诺之前做某事,通常,对于调用 startProcess 的任何东西?关键是,这个函数不知道是谁在调用它,也不知道调用者对 Promise 做了什么;它本质上只是 doProcess 的包装器。
解决方案
使用 async/await... 它使处理 Promise(以及类似情况)变得更加容易,因为它使所有内容都像同步一样读取。
像这样的东西。
const someFunction = async () => {
const startTime = (+new Date());
await someAsyncCall();
const endTime = (+new Date());
return [startTime, endTime]
}
另一个没有箭头函数和 const 东西的例子......
var someFunction = async function() {
var startTime = (+new Date());
await someAsyncCall();
var endTime = (+new Date());
return [startTime, endTime]
}
推荐阅读
- c# - 在 Web API 和 Swagger 中使用 Google 进行身份验证
- sql - 由于列名相同而无法创建视图(并且不能修改列名)
- java - 使用java将某个月份添加到当前日期
- android - 在 Xamarin iOS 和 Android 项目中设置 Firebase Crashlytics 的问题
- ios - 首次加载时 UINavigationBar 较小;向后导航时更大
- python - Django 作为 Selenium 的前端
- bootstrap-4 - 仅在平板电脑纵向和横向上更改列顺序
- python - 通过一个 SMTP 服务器从多个电子邮件地址发送电子邮件
- google-chrome - 谷歌浏览器扩展开发问题
- java - SpringBoot Security 不将登录端点列入白名单