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

Why isn't .then() waiting for the promise?

本文关键字:等待 承诺 then 为什么      更新时间:2023-09-26

我目前正在做一个角度项目,我对它有点陌生。

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

我认为它必须与我的getAllStats()功能中只有一个$q.defer()有关?当我尝试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);
});

请参阅此代码中的注释:

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传统承诺衡量成功与错误 已被弃用。请改用标准的 then 方法。如果 $httpProvider.useLegacyPromiseExtensions 设置为 false 则这些 方法将引发$http/遗留错误。

参见:$http

在您的示例中,此块:

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

获取 dataArray,它是一个字符串,并逐个字符地运行它。此外,您没有设置文件名文件。将呼叫更改为:

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

然后,为了使承诺的推动是正确的,请这样做:

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

这里有多个问题错误:

  1. 您正在将一个空的promises数组传递给$q.all() 。 它必须是一系列承诺,当你把它传递给$q.all()
  2. 当您可以归还您拥有的承诺时,您正在创建承诺
  3. getAllStats()需要一个数组,但您传递的是一个字符串。

我建议对解决上述问题的代码进行全面清理:

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);
});

我还建议你阅读承诺反模式,以自学如何使用你已经拥有的承诺,并避免在不需要新承诺时创建新的承诺。

附言我不确定nameOfFile论点的意义何在,因为您不想一遍又一遍地getStats()同一个文件。