[英]JavaScript: how to return a value from a asyn function in a for loop
我得到了一个服务,如下所示返回一个值:
// Service.js
var done = false;
var readyToSubmit = function(answerArr, len) {
var threshold = 0;
for (var i = 0; i < answerArr.length; i++) {
var id = answerArr[i].focus + '_' + userData.uid;
appStore.getDoc(id).then(function(doc) {
if (doc.doneRate == 100) {
threshold++;
if (threshold == len) {
done = true;
} else {
done = false;
}
}
});
}
return done; // here, It always returns 'undefined'.
};
我想在我的AngularJs项目中使用此服务,如下所示:
var answerArr = $scope.homework.items;
var len = answerArr.length;
$scope.$on('appChange', function(e, doc) {
$scope.done = hwService.readyToSubmit(answerArr, len);
});
但是,总是没有运气,尽管我尝试调用readyToSubmit(para1, para2, callback)
,但这种调用不会带来任何readyToSubmit(para1, para2, callback)
。 这真的使我烦了大约4个小时。 所以有人想在这里帮我一个忙吗? 非常感谢~~ :)
您不能使用这样的异步函数。
您可以使用角度承诺来实现这一目标。
// Service.js
var done = false;
var defered = $q.defer() //include in service function $q
var readyToSubmit = function(answerArr, len) {
var threshold = 0;
for (var i = 0; i < answerArr.length; i++) {
var id = answerArr[i].focus + '_' + userData.uid;
appStore.getDoc(id).then(function(doc) {
if (doc.doneRate == 100) {
threshold++;
if (threshold == len) {
defered.resolve(true);
} else {
done = false;
}
}
});
}
return done; // here, It always returns 'undefined'.
};
使用延迟对象来利用角度承诺。 如果defered.resolve()
,它将调用.then
。
var answerArr = $scope.homework.items;
var len = answerArr.length;
$scope.$on('appChange', function(e, doc) {
hwService.readyToSubmit(answerArr, len).then(function(done){
$scope.done = done;
});
});
关键是您不能返回done
变量,因为当您想返回它时,您的for循环中的回调函数:
appStore.getDoc(id).then(function(doc) {
//...
})
还未接到电话。 因为正如您在问题中也提到的那样,它是一个asynchronous function
。
您有2个选项,首先是使用Angular Promise,这在另一个答案中有描述,但是您还有另一个解决方案,其在readyToSubmit
函数中使用回调:
var done = false;
var readyToSubmit = function(answerArr, len, callback) {
var threshold = 0;
for (var i = 0; i < answerArr.length; i++) {
var id = answerArr[i].focus + '_' + userData.uid;
appStore.getDoc(id).then(function(doc) {
if (doc.doneRate == 100) {
threshold++;
if (threshold == len) {
callback(true);
} else {
callback(false);
}
}
});
}
//no need to return anything
//return done;
};
然后在您的角度范围内使用:
var answerArr = $scope.homework.items;
var len = answerArr.length;
$scope.$on('appChange', function(e, doc) {
hwService.readyToSubmit(answerArr, len, function(done){
$scope.done = done;
});
});
这样,您必须要考虑的是这一行代码:
$scope.done = done;
将不止一次地被致电。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.