为什么 .then() 不等待承诺
Why isn't .then() waiting for the promise?
我目前正在做一个角度项目,我对它有点陌生。
我不明白,为什么.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]));
这里有多个问题错误:
- 您正在将一个空的
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);
});
我还建议你阅读承诺反模式,以自学如何使用你已经拥有的承诺,并避免在不需要新承诺时创建新的承诺。
附言我不确定nameOfFile
论点的意义何在,因为您不想一遍又一遍地getStats()
同一个文件。
相关文章:
- 等待循环调用的所有承诺完成
- RxJS等待承诺解决
- 余烬后渲染不等待承诺
- 如何在恢复函数之前等待 JavaScript 承诺解析
- 和Mocha一起等待未兑现的承诺
- 等待承诺
- socket.io - 套接字等待承诺
- 为什么 .then() 不等待承诺
- Javascript/Angularjs :等待承诺实现,然后再进入foreach Loop中的下一次迭代
- 等待承诺
- 使用Ember(cli),我如何获得一个等待承诺的验收测试
- 如果我屈服于承诺,它会等待承诺得到解决后再继续吗
- Do量角器's期望在内部等待承诺
- 等待承诺链中的所有承诺
- 如何在量角器/茉莉测试中等待承诺
- while(true)循环中的承诺/等待承诺解决
- 函数用于等待承诺和检索结果
- 用不同的方法等待承诺
- 等待承诺 - 角度 2.
- 在等待承诺的同时切换 AngularJS 视图