当前位置: 首页 > 面试题库 >

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

胡飞舟
2023-03-14
问题内容

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

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

joe@gmail.com - valid
abc@fjkdsl.com - invalid
xyz@yahoo.com - valid
test@nknk.com - 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响应?


问题答案:

用诺言。Angular可以在没有任何“特殊干预”的情况下使用promise,就像为范围变量分配值一样,请参见plnkr。承诺是驯服异步编程以像同步编程一样工作的“基础”(尽管我们在浏览器中没有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: 'joe@gmail.com', name: 'Joe'},
    {email: 'abc@fjkdsl.com', name: 'Abc'},
    {email: 'xyz@yahoo.com', name: 'XYZ'}, 
    {email: 'test@nknk.com', 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时,您可以为scope分配一个范围变量,并且可以在ng- repeat不更改代码的情况下使用它



 类似资料:
  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包:

  • 您好,我正在使用for循环和异步ajax调用为本地存储创建批处理更新。 我的问题是,即使我的ajax调用还没有成功完成,我的循环仍在继续。 在继续循环之前,我们如何使for循环等待单元成为ajax响应的响应? 任何帮助都很感激。谢谢!!! 下面是我的示例代码:

  • 问题内容: 我有以下代码: 是与Memcached数据库的连接。可以想象,回调函数是异步的,因此可以在for循环已结束时执行。同样,以这种方式调用时,它始终使用for循环的最后一个值。 我用这种方式尝试关闭 但是显然,这再次使用了for循环索引的最后一个值。 我也尝试在for循环之前声明一个函数,如下所示: 然后打电话 但同样没有成功,返回值始终是for循环的最后一个值。 谁能告诉我关闭有错吗?我

  • 问题内容: 我是这个Node.js的新手..我对此回调有点困惑..在我的应用程序中,我在for循环内调用异步函数调用,我想我的问题是在得到异步调用响应之前, for循环被循环。 我的代码: 搜索功能代码: 我想在成功执行1个搜索功能后执行for循环,我想我必须使用async for loop。请指导我解决此问题。 问题答案: 我将您的代码示例简化为以下几行,以使您更容易理解该概念。 先前代码的问题

  • 问题内容: 我想用这样的for循环遍历$ scope变量。在此示例中,$ scope对象包括一个包含 5个对象的对象 帐户 ,这些对象的名称是从1到5的数字。每个对象都有一个名称。 问题: $ scope.accounts.i 是 未定义的, 因为在 $ scope 变量内我不算为变量。它算作字母i,因此我看不到有机会用for循环遍历作用域。当我在$ scope变量周围使用“”时,它将仅显示为纯h

  • 问题内容: 在循环中使用/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。 这段代码确实有效,但是这可能会出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用/ ,所以我只是想问一下这是否有问题。 问题答案: 确保代码确实有效,但是我很确定它不会实现您期望的功能。它只会触发多个异步调用,但此后函数会立即返回。 顺序阅读 如果要顺序读取文件, 则不能使用。只需使用现代循环即可,该循环将按预