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

标签 javascript angularjs couchdb

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

相关文章:

javascript - AngularJS 加/减切换

javascript - HTML/CSS 复选框文本与 <span> 或 <div> 对齐

couchdb - 如何在 CouchDB 上执行参数化查询

javascript - jQuery css ("display","table-cell") 不会立即应用

javascript - 使用 javascript onClick 启动/停止声音

javascript - 将嵌套对象与 JavaScript 中的数组进行比较并返回键相等

javascript - .length 不适用于 $resource 导致 angularjs

在 couchdb 中搜索或通过 Elasticsearch 进行 river

couchdb - 使用不同类型/格式的 _id 可以吗?

javascript - ExtJS 6 - 输入类型为 'password' 的文本字段在 Chrome 开发工具中生成警告