【发布时间】:2019-10-12 08:56:46
【问题描述】:
不知道如何问这个问题,而且我真的在为 promises 苦苦挣扎,所以我将尝试一个简化的示例。
假设我有一个接受回调的函数。在那个函数中,我想进行一个也有回调的异步调用,所以当它的回调被调用时,我会根据它的响应做一些事情,然后调用我的回调。
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,该promise 由startProcess 返回。然后调用者对它做任何事情。
现在,我想在 doProcess 周围包装一些代码来捕获开始和结束时间,而不会对现有代码的操作造成任何干扰。有没有什么方法可以响应 doProcess 的完成以在它解决承诺之前做某事,通常,对于调用 startProcess 的任何东西?关键是,这个函数不知道是谁在调用它,也不知道调用者对 Promise 做了什么;它本质上只是 doProcess 的包装器。
【问题讨论】:
-
代码中没有任何承诺...您会期望
.then(根据问题标题的内部和外部)-或async/await-您的代码没有任何异步查看 -
So, structurally, my function would now look something like this:- 不,它不会......How to capture endTime on then before moving on?- 因为你return someAsyncCall()没有“继续前进” -
someAsyncCall里面有什么?我假设在某些时候它有promise.resolve(),在这种情况下,它似乎就像在解析调用之前添加callback()一样简单...... -
重点是,someAsyncCall 之前是一个异步操作,它调用提供给它的回调函数(在示例中作为立即函数),而 someFunction 提供了一个回调,我将在此之后调用它。但是现在 someAsyncCall 返回了一个 promise,它也由 someFunction 返回,所以调用者现在有了一个带有 then 条件的 promise。不确定它与 someAsyncCall 的相关性如何,因为它是提供 then 条件的调用者。
-
我已经通过在异步调用周围包装承诺解决了我的问题。在答案中查看我的解决方案。
标签: javascript promise