【问题标题】:Infinite loop with javascript (Angular NgFor and http request)带有 javascript 的无限循环(Angular NgFor 和 http 请求)
【发布时间】:2016-03-29 03:15:36
【问题描述】:

问题是同时我正在尝试检查资源服务器上是否存在一个图像,Angular NgFor 正在执行它的工作。

我可以猜到,img.src 执行了请求,然后我在回调中的返回没有按预期返回,事实上,defaultPrincipalUrl 方法没有按预期返回任何内容,因此 Angular 一次又一次地执行相同的请求.

但是,我不知道用 Javascript 解决它的方法。

html 中的 NgFor 如下所示。

<div class="formItem">
    <div *ng-for="#principal of localService.defaultPrincipals">
        <img src="{{defaultPrincipalUrl(principal)}}" />
    </div>
</div>

其中 localService.defaultPrincipals 是一个包含图像名称的数组。

在 Angular2 @Component 类中,我有下一个实现。

private imageExists(imageSrc, callback) {

    var img = new Image();

    img.onload = function () { callback(imageSrc, true); };
    img.onerror = function () { callback(imageSrc, false); };

    img.src = imageSrc;
}

defaultPrincipalUrl(principal) {

    var im = IMAGE_DOMAIN + '/principal/' + principal;

    console.log(im);

    this.imageExists(im, function (imageSrc, exists) {

        console.log('RESULT: url=' + imageSrc + ', exists=' + exists);

        if (exists) {

            return imageSrc;
        } else {

             return '#';
        }
    });
}

【问题讨论】:

  • defaultPrincipalUrl 不返回值 .. 调用回调返回的值不会被传播(它也是一个异步回调)。

标签: javascript typescript angular


【解决方案1】:

使用 async 管道。

<div class="formItem">
    <div *ng-for="#principal of localService.defaultPrincipals">
        <img src="{{defaultPrincipalUrl(principal) | async}}" />
    </div>
</div>

defaultPrincipalUrl的结果必须是一个promise,因为回调是异步的:

private imageExists(imageSrc, callback) {

    var img = new Image();

    img.onload = function () { callback(imageSrc, true); };
    img.onerror = function () { callback(imageSrc, false); };

    img.src = imageSrc;
}

defaultPrincipalUrl(principal) {

    var im = IMAGE_DOMAIN + '/principal/' + principal;

    console.log(im);

    let self_ = this;

    return new Promise(function(resolve, reject) {

    self_.imageExists(im, function (imageSrc, exists) {

        console.log('RESULT: url=' + imageSrc + ', exists=' + exists);

        if (exists) {
            resolve(imageSrc);
        } else {
            resolve('#');
        }
    });


    });

}

【讨论】:

  • 请回答 Mourad Zouabi,我正在寻找类似你的贡献,与 Promises 或其他东西一起工作的东西;)。但是,令人惊讶的是,行为是相同的,无限循环执行。如果你愿意,我可以更新 #1,但代码看起来像是你发布的。
  • 有关更多信息,我正在使用“2.0.0-alpha.46”,认为该版本的功能可能有问题,我已升级到“2.0.0-beta” .0",但没有任何改进。
猜你喜欢
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2020-09-18
  • 2022-01-15
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多