为什么不.then()等待承诺?

时间:2016-02-21 22:53:04

标签: javascript angularjs

我目前正在开展一个有角度的项目,我对此很陌生。

我不明白,为什么.then()功能不等待承诺?

我认为必须做一些事情,我的$q.defer()函数中只有一个getAllStats()?当我尝试console.log("testing: ", data);(在底部)时,它只会注销一个空数组。有人可以帮帮我吗?

这是我的代码:

function getAllStats(dataArray, nameOfFile) {
    var defer = $q.defer();
    var promises = [];


    for (index in dataArray) {
        if (dataArray[index].indexOf('test') > -1 ) {
            getStats(nameOfFile).then(function (data) {
                 promises.push();
            });
        }
    }

    function last() {
        defer.resolve(promises);
    }

    $q.all(promises).then(last);
    return defer.promise;
};

function getStats(nameOfFile) {
    var defer = $q.defer();
    $http.get(nameOfFile).success(function (data) {
        defer.resolve(data);
    });
        return defer.promise;
};

getAllStats('test.txt').then(function(data) {
        console.log("testing: ", data);
});

3 个答案:

答案 0 :(得分:3)

请参阅此代码中的评论:

function getAllStats(dataArray, nameOfFile) {
    var promises = [];
    // using `for (index in dataArray) {` is a bad idea unless
    // dataArray is a non-array object
    for (var index = 0; index < dataArray.length; index++) {
        if (dataArray[index].indexOf('test') > -1 ) {
            // Here is the trick, store the promise itself,
            // don't try to subscribe to it here
            promises.push(getStats(nameOfFile));
        }
    }
    return $q.all(promises);
};

function getStats(nameOfFile) {
    // http.get already returns a promise, see explicit promise creation antipattern
    return $http.get(nameOfFile).then(function(r) { return r.data; });
};

getAllStats('test.txt').then(function(data) {
        console.log("testing: ", data);
});

参考文献:

  

弃用通知

     

$ http遗留承诺方法成功与错误   已被弃用。请改用标准方法。如果   $ httpProvider.useLegacyPromiseExtensions设置为false然后这些   方法将抛出$ http / legacy错误。

     

请参阅:$http

答案 1 :(得分:0)

这里有多个问题:

  1. 您正在将空promises数组传递给$q.all()。在将其传递给$q.all()时,它必须是一系列承诺。
  2. 当你能够归还你拥有的
  3. 时,你就会创造承诺
  4. getAllStats()需要一个数组,但是你传递了一个字符串。
  5. 我建议对代码进行整体清理以解决上述问题:

    function getAllStats(dataArray) {
        var promises = dataArray.filter(function(item) {
            return item.indexOf('test') !== -1;
        }).map(function(item) {
             return $http.get(item);
        });
    
        return $q.all(promises);
    };
    
    getAllStats(['test.txt']).then(function(data) {
            console.log("testing: ", data);
    });
    

    我还建议您阅读promise anti-patterns来教会自己如何使用已有的承诺,并避免在没有新承诺时创建新的承诺。

    P.S。我不确定nameOfFile论点的重点是什么,因为您不希望一遍又一遍地在同一个文件上getStats()

答案 2 :(得分:0)

在你的例子中这个块:

for (index in dataArray) {
    if (dataArray[index].indexOf('test') > -1 ) {
        getStats(nameOfFile).then(function (data) {
             promises.push();
        });
    }
}

采用dataArray,这是一个字符串,并通过char运行char。此外,您没有设置nameOfFile。将通话更改为:

getAllStats(['test.txt']).then(function(data) {
    console.log("testing: ", data);
});

然后推动承诺是正确的,这样做:

promises.push(getStats(dataArray[index]));