我有这个功能:

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秒等待时间为止。

09-17 08:49