列表中的每个电子邮件都将发送到服务器,并从服务器获得响应(如果它是有效电子邮件)。
因此,在检查完所有电子邮件之后,数组应具有:
[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响应?
用诺言。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] 删除。
我来说两句