在其范围之外使用.then方法的函数

时间:2018-03-06 07:27:03

标签: javascript promise paint web-performance

我有一个名为 paintTiming.js 的文件,它使用Paint Timing API来查找Web性能参数,例如First Paint和First Contextual Paint。文件内容如下所示:

abstract trait TestSAM$MySamWithEmptyParameter extends Object {
  def receive(): Int
};

abstract trait TestSAM$MySamWithParameterless extends Object {
  def receive(): Int
};

如您所见,在解析promise时应创建函数abc()

我的问题:如何在承诺之外使用此功能?

例如,请考虑以下示例(在HTML文件中使用):

var FP, FCP, obj = [];

function parent() {
    if ("PerformanceObserver" in window) {
        let observerPromise = new Promise((resolve, reject) => {
            // access the PerformanceObserver interface
            let observer = new PerformanceObserver((list) => {
                resolve(list);
            });

            observer.observe({
                entryTypes: ["paint"]
            });
        }).then((list) => {
            // Find out First Paint and First Contextual Paint
            FP = list.getEntries()[0].startTime;
            FCP = list.getEntries()[1].startTime;
            // Store in array
            obj[0] = FP;
            obj[1] = FCP;
            element = "The paint times are: <br> First Paint : " + FP + "ms, <br> First Contentful Paint : " + FCP + "ms";
            // show values on web page
            document.getElementsByTagName('p')[1].innerHTML = element;
        }).then(() => {
            // check if array is created, and is functioning
            console.log(obj[0]);
        }).then(() => {
            // create function
            function abc() {
                return {
                    a: obj[0],
                    b: obj[1]
                };
            };
        }).catch((error) => {
            console.warn(error);
        });
    }
};

控制台显示未定义该功能。如果JS代码是内联的,它仍然无法正常工作。

1 个答案:

答案 0 :(得分:1)

如果在.then内声明了此功能,则可能无法使用该功能。因为此函数abc对于传递给.then&amp;的回调函数是私有的。 .then只会用ajax执行。

或者,您可以在Promise之外定义此函数,并在.then回调中调用此函数。还需要使用bind

this上下文