我有这个功能:
waitForFreeAccnt.prototype.isMemberFree = function () {
var self = this;
self.api.getMemberInfo(function () {
var accType = self.api.connect.accountType;
console.log(accType);
if (accType === 'FREE') {
console.log('it is free');
return true;
} else {
console.log('it is not free');
return false;
}
});
};
我想等到帐户免费使用长达10秒,例如:
var test = function () {
for (var start = 1; start < 10; start++) {
var result = self.isMemberFree();
console.log(result);
if (result) {
break;
} else {
self.api.pause(1000);
console.log('waiting');
}
}
};
但这不起作用,因为
self.api.getMemberInfo
是异步调用。这让Java感到非常沮丧。任何其他语言都将如此简单。如何强制for循环等待self.isMemberFree()
完成执行然后继续循环?还要注意,这不在浏览器执行中,因此我不关心任何挂起的问题。
最佳答案
我今天没有工作用的笔记本电脑,因为今天是星期天,我正在对此进行编码。如果语法不正确,请向我们道歉。
为了解决您的问题,我建议您更改isMemberFree()以使用回调函数。这是因为isMemberFree是异步的,您需要一种在完成工作后报告结果的方法。
然后更改测试功能以使用setTimeout API等待一秒钟。
将isMemberFree()的函数调用包装在嵌套函数中,然后递归调用它,这样您就可以对异步调用进行同步控制。
看一下编码示例:
waitForFreeAccnt.prototype.isMemberFree = function (done) {
var self = this;
self.api.getMemberInfo(function () {
var accType = self.api.connect.accountType;
console.log(accType);
if (accType === 'FREE') {
console.log('it is free');
return done(null, true);
} else {
console.log('it is not free');
return done(null, false);
}
});
};
var test = function () {
var testMembership = function(waitAttempt, isFree) {
if (isFree) {
return;
}
else if (waitAttempt > 10) {
// wait exceeded, do something.
return;
}
setTimeout(function() {
self.isMemberFree(function(err, isFree) {
testMembership(waitAttempt+=1, isFree);
});
}, /*total milliseconds in 1sec=*/1000);
}
testMembership(/*WaitAttempts=*/0, /*isFree=*/false);
};
上面的代码所做的是,假定已对成员帐户进行了某些操作,现在调用了测试功能。因此,它等待1秒钟,然后调用isMemberFree函数,此过程将递归发生,直到isMemberFree()返回true或超过10秒等待时间为止。