gpt4 book ai didi

javascript - 使用 angularjs 将多个独立附件上传到 couchdb

转载 作者:行者123 更新时间:2023-11-28 01:57:46 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com