javascript递归类:未定义的方法

时间:2016-01-05 23:19:30

标签: javascript class recursion promise

我有一个JavaScript类,旨在帮助处理承诺。首先,您将函数添加到数组,然后执行它们弹出它们并调用自己来执行下一个。在数组的末尾,它解决了这个承诺。我希望然后将解决方案一直传播到递归调用的堆栈中。这将允许您使用一组简单的命令强制执行多个异步函数。此外,还采用逻辑来修改ansync函数的流程。

[RoutePrefix("api/produceusage")]
public class ProduceUsageController : ApiController
{
    [Route("{unit}/{begindate}/{enddate}")]
    public HttpResponseMessage Get(string unit, string beginRange, string 
endRange)
    {
        . . .

    [Route("{unit}/{begindate}/{enddate}")]
    [HttpPost]
    public void Post(string unit, string begindate, string enddate)
    {
        . . .

我收到了ReferenceError:'executeAll'未定义 在这个脚本中,在splice

之后的递归调用行“executeAll”上

正在执行数组中的第一个函数(我正在使用模式弹出窗口进行测试),当它解析时会触发拼接,然后它会在executeAll行上抛出错误。我是否错误地定义了该功能?我是否正确地将其称为递归函数?

1 个答案:

答案 0 :(得分:1)

使用this.executeAll - 假设this是正确的,它不会,所以你也需要考虑到这一点......像executeAll顶部的var self = this之类的东西,然后拨打self.executeAll

this.executeAll = function() {
    var functionList = this.functionSequence;
    var deferred = $q.defer();
    var self = this; // save reference to this
    if (functionList.length > 0) {
        functionList[0]().then(function(result) {
            if (result) {
                functionList.splice(0, 1);
                // need to use self here because "this" is not the "this" we want
                self.executeAll().then(function(resultInner) {
                    if (resultInner == true) {
                        deferred.resolve(true);
                    } else {
                        deferred.resolve(false);
                    }
                });
            } else {
                functionList = [];
                deferred.resolve(false);
            }
        });
    } else {
        deferred.resolve(true);
    }
    return deferred.promise;
};

this不是您想要的this的原因是由于this在javascript中的工作原理 - 有关使用this的堆栈交换信息很多 - 我会很快找到并链接一个好的答案

我提供此替代代码

this.executeAll = function() {
    return this.functionSequence.reduce(function(promise, item) {
        return promise.then(function(result) {
            if (result) {
                return item();
            }
            else {
                throw "Fail"; // throw so we stop the chain
            }
        });
    }, Promise.resolve(true))
    .then(function(result) {
        this.functionSequence = []; // clear out the added functions
        return true; // fulfilled value is true as per original code
    }.bind(this), function(err) {
        this.functionSequence = []; // clear out the added functions
        if (err == "Fail") {
            return false; // convert the "Fail" to a fullfilled value of false as per original code
        }
        else {
            throw err; // any other error - re-throw the error
        }
    }.bind(this))
};