我正在尝试使用 angularjs 将多个文件上传到 couchdb 文档。我尝试使用 angular.forEach 循环来执行此操作,但是,当循环继续而不等待前一个循环完成其异步 $http 调用时,此操作会失败。 这是我的代码目前的样子:
angular.forEach($scope.fileList, function(value, key){
couch.getRevisionId($scope.plan._id)
.then(function(response){
couch.uploadAttachment($scope.plan._id, response[1], value[0])
.then(function(response2){
console.log("Response2", response2);
},
function(reason2){
console.log("Reason2", reason);
});
},
function(reason){
console.log("GetrevisionId failed reason=", reason)
});
});
couch.getRevisionId 是一个 $http HEAD 调用,返回附件所保存到的文档的当前修订 ID 的 promise 。 couch.uploadAttachment 是一个 $http PUT 调用,它将附件保存到文档中。此代码适用于第一个文件,不幸的是,由于代码异步运行,下一次循环运行在第一个文件 PUT 之前的附件之前运行,因此 couch.getRevisionId 返回与前一个调用相同的修订 ID,导致代码失败当它尝试将附件保存到更新的文档时出现 409 冲突。 有没有办法延迟后续循环,直到 getRevisionId 和 uploadAttachment promise 返回之后?
最佳答案
您可以按照 Q documentation 中的描述链接 promise 。关于序列,但使用 Angular $q
API
var asyncTask = function (value) {
var deferred = $q.defer();
...
return deferred.promise;
};
var list = [ ... ];
var deferred = $q.defer();
var promise = deferred.promise;
angular.forEach(list, function (value) {
promise = promise.then(function () {
return asyncTask(value);
});
});
deferred.resolve();
查看完整示例 here .
如果您的 CouchDB 服务已经依赖于 $q
,那么您可能不需要将异步任务包装在另一个更高级别的 $q
Promise 中。
关于javascript - 使用 angularjs 将多个独立附件上传到 couchdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18859272/