繁体   English   中英

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

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

我目前正在从事一个有角度的项目,并且对它有些陌生。

我不明白,为什么.then()函数不等待诺言?

我认为这与我在getAllStats()函数中只有一个$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);
});

请参阅以下代码中的注释:

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旧式的Promise方法成功和错误已被弃用。 请改用标准然后方法。 如果$ httpProvider.useLegacyPromiseExtensions设置为false,则这些方法将引发$ http / legacy错误。

查看: $ http

这里有多个错误的问题:

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

我还建议您阅读有关承诺反模式的知识,以教会自己如何使用已有的承诺,并避免在不需要新承诺时创建新的承诺。

PS我不确定nameOfFile参数的意义是什么,因为您不想nameOfFile成为同一文件的getStats()

在您的示例中,此块:

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

接受dataArray,它是一个字符串,并逐字符地遍历char。 另外,您没有设置nameOfFile。 将呼叫更改为:

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

然后要使承诺正确无误,请执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM