如何在角度循环中使用异步调用?

阿努巴

列表中的每个电子邮件都将发送到服务器,并从服务器获得响应(如果它是有效电子邮件)。

因此,在检查完所有电子邮件之后,数组应具有:

[email protected] - valid
[email protected] - invalid
[email protected] - valid
[email protected] - invalid

循环发送电子邮件到服务器的代码如下:

for(var i=0; i < isEmailValidList.length; i++) {
  var isEmailValid = User.validateEmail({email : isEmailValidList[i].email}, function(){
      isEmailValidList[i].isValid = isEmailValid.value;
  });
}

但是问题在于调用是异步的,因此,假设i = 0,则当i为0时控件将不会进入函数。因此,当i进入函数时,i的值可以是任何值,通常大于数组的长度,因此isEmailValidList [i]未定义。如果呼叫是同步的,则它将等待响应,而我不会被递增,但事实并非如此。

那么,如何获得其相应电子邮件的正确isValid响应?

Pocesar

用诺言。Angular可以在没有任何“特殊干预”的情况下使用promise,就像为范围变量分配值一样,请参见plnkr。Promise是驯服异步编程以像同步编程一样工作的“基础”(尽管我们在浏览器中没有JavaScript生成器),并且受Angular团队的鼓励,因为它具有很高的可测试性和可维护性。

http://plnkr.co/edit/8BBS2a1kC24BHBWRYp9W?p=preview

// trying to emulate your service here

var app = angular.module('app', []);

app.factory('User', function($q, $timeout){
  User = {};

  User.validateEmail = function(email){
    var d = $q.defer();

    $timeout(function(){
      if (/(yahoo|gmail)/.test(email.email)){
        d.resolve(email); // return the original object, so you can access it's other properties, you could also modify the "email" object to have isValid = true, then resolve it
      } else {
        d.resolve(); // resolve it with an empty result
      }
    }, 1000, false);

    return d.promise;
  };

  return User;
  });

app.controller('MainCtrl', function(User, $q){
  this.emails = [
    {email: '[email protected]', name: 'Joe'},
    {email: '[email protected]', name: 'Abc'},
    {email: '[email protected]', name: 'XYZ'}, 
    {email: '[email protected]', name: 'test'}
  ];

  this.isEmailValidList = [];
  var promises = [];

  for(var i=0; i < this.emails.length; i++) {
    promises.push(
      User.validateEmail(this.emails[i]) 
    );
  }

  $q.all(promises).then(function(emails){ 
    this.isEmailValidList = emails.filter(function(e){ return e; });
  }.bind(this));

});

注意:$timeout用来模拟异步任务,例如数据库调用等。您可以将整个emails数组传递给验证服务,然后返回该数组,而不是创建一个promise的中间数组。使用angular时,可以将一个范围变量分配给promise,并且可以在ng-repeat不更改代码的情况下使用它

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在角度循环中使用异步调用?

来自分类Dev

如何在firestore.forEach循环中进行异步调用?

来自分类Dev

使用异步调用在for循环中构建数组

来自分类Dev

循环中的AngularJS异步调用

来自分类Dev

循环中的异步调用延迟

来自分类Dev

如何在同步循环中使用异步变量?

来自分类Dev

角度异步调用

来自分类Dev

循环中的所有异步调用完成后,如何调用函数?

来自分类Dev

如何在Scrapy / Twisted中使用线程,即如何在响应回调中异步调用阻塞代码?

来自分类Dev

如何在具有异步功能Swift的循环中使用调度组?

来自分类Dev

如何在具有sails.js异步结构的循环中使用查询?

来自分类Dev

在无限循环中使用$ rootscope.broadcast时,如何在异步模式下编写函数?

来自分类Dev

如何在for循环中使用invalidate()

来自分类Dev

如何在for循环中使用awk?

来自分类Dev

如何在循环中使用 fgets?

来自分类Dev

如何在循环中使用 Collection

来自分类Dev

如何在 For 循环中使用 UIAlertController

来自分类Dev

如何使用 mockito 存根异步调用?

来自分类Dev

通过许多异步调用在WebAPI中使用异步

来自分类Dev

异步调用并行for循环

来自分类Dev

异步调用的同步循环

来自分类Dev

循环内异步调用

来自分类Dev

如何在使用jstl的if循环中使用if循环

来自分类Dev

如何在循环中使用os.fork()调用不同的函数?

来自分类Dev

如何在循环中使用os.fork()调用不同的函数?

来自分类Dev

如何在调用时立即执行异步调用?

来自分类Dev

如何等待进行异步调用的.each循环?

来自分类Dev

如何使循环等待异步调用成功后才能继续

来自分类Dev

从for循环中的多个连续异步调用中调用多个setState挂钩

Related 相关文章

热门标签

归档