![](/img/trans.png)
[英]Why isn't my async function waiting for the promise to be fulfilled
[英]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
这里有多个错误的问题:
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);
});
我还建议您阅读有关承诺反模式的知识,以教会自己如何使用已有的承诺,并避免在不需要新承诺时创建新的承诺。
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.