我目前正在开展一个有角度的项目,我对此很陌生。
我不明白,为什么.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);
});
答案 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)
这里有多个问题:
promises
数组传递给$q.all()
。在将其传递给$q.all()
时,它必须是一系列承诺。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);
});
我还建议您阅读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]));