【问题标题】:Why angularjs plugins use $timeout for no apparent reason为什么 angularjs 插件无缘无故地使用 $timeout
【发布时间】:2016-04-25 15:14:55
【问题描述】:

我只是一个初学者,所以不要评判我。

我见过很多 angularjs 插件(指令/服务)在没有任何时间(或时间 = 1ms)的情况下使用 $timeout 函数。

例如:

scope.openGallery = function (i) {
    if (typeof i !== undefined) {
        scope.index = i;
        showImage(scope.index);
    }
    scope.opened = true;
    document.body.style.overflow = 'hidden';
    /////*******Here*******/////
    $timeout(function() {
        var calculatedWidth = calculateThumbsWidth();
        scope.thumbs_width = calculatedWidth.width;
        $thumbnails.css({ width: calculatedWidth.width + 'px' });
        $thumbwrapper.css({ width: calculatedWidth.visible_width + 'px' });
        smartScroll(scope.index);
    });
};

他们这样做的任何具体原因或这样做的好处?

【问题讨论】:

标签: javascript angularjs


【解决方案1】:

它使功能脱离主显示线程(或者,尽可能接近 javascript 中的“线程”)。

如果它封装的功能是长时间运行的,则意味着浏览器不会无响应。

【讨论】:

    【解决方案2】:

    它在执行回调之前等待当前摘要循环完成。如果需要存在依赖于摘要循环的其他函数的某些副作用才能使特定代码段正常工作,这将很有用。

    例如,假设$timeout() 上面的代码设置了一个由控制器$watch()ed 的变量,并且控制器执行了一些其他逻辑并设置了一些变量,$timeout() 内的代码需要这些要更新的变量以使其正常工作。优秀的 Angular 开发人员会尽量避免这种情况,但无论如何都会出现这种情况,$timeout() 是处理它的最佳方式。

    【讨论】:

      【解决方案3】:

      也许你应该先看看这个答案。 它非常清楚地解释了 $timeout 的功能。

      $timeout in angularjs

      它还自动为你包装你的回调在一个 try/catch 块中,让你处理 $exceptionHandler 服务中的错误。

      它返回一个承诺,因此与传统的回调方法相比,它倾向于与其他基于承诺的代码更好地互操作。当您的回调返回时,返回的值用于解决承诺。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 2019-03-16
        相关资源
        最近更新 更多