1

我有以下代码:

$scope.getEntriesBySpace = function(space, entryIds){
        var entriesHolder = [],
            errors = [];

        if(entryIds && entryIds.length > 0){
            angular.forEach(entryIds, function(entryId){
                space.cf_space.getEntry(entryId.trim()).catch(function(error) {
                    console.log('Could not find entry using access token, Error', error);
                    return error;
                }).then(function(response) {
                    if(response){
                        entriesHolder.push(data);
                    }else{
                        errors.push({"id": entryId, "message": "Entry not found"});
                    }
                });
            });
        }
    };

我这样称呼它:

$scope.getEntriesBySpace(sourceSpace, entries);

我想在循环内完成每个调用后存储每个响应,并作为响应或错误数组返回。

任何帮助表示赞赏。

方法getEntry返回承诺。

如需参考,请参阅此库:https ://github.com/contentful/contentful-management.js

谢谢

4

3 回答 3

1

您可以为此使用 lib async: https ://github.com/caolan/async

$scope.getEntriesBySpace = function(space, entryIds){
    var entriesHolder = [],
        errors = [];

    var fn = function(entryId, callback){
          space.cf_space.getEntry(entryId.trim())
              .catch(function(error) {
                   console.log('Could not find entry using access token, Error', error);
                   /// just get out of here
                  return callback({"message": "Entry not found"});
              }).then(function(response) {
                  if(response){
                      // good response
                      return callback(null, data);
                  }else{
                      // bad response
                      return callback({"id": entryId, "message": "Entry not found"});
                  }
              });
    });

    if(entryIds && entryIds.length > 0){
        async.map(entryIds, fn, function(err, results){
            if(err) {
                // deal with the errors
            }
            // your array
            console.log(results);
        });
    }

});
于 2016-03-11T15:34:00.980 回答
1

getEntriesBySpace无法返回您想要的项目数组(异步)。但是,它可以返回一个引用所需项目数组的承诺。或者,由于您也需要错误,因此需要一个同时包含良好结果和错误的对象。

$scope.getEntriesBySpace = function(space, entryIds){

    if(entryIds instanceof Array){
        return Promise.all(entryIds.map(function(entryId){
            return space.cf_space.getEntry(entryId.trim()).catch(function(error) {
                console.log('Could not find entry using access token, Error', error);
                throw error;
            });
       })).then(function(responses) {
           var resultAndErrors = {result: [], errors: []};
           responses.forEach(function(response) {
               if (!response) {
                   resultAndErrors.errors.push(({"id": entryId, "message": "Entry not found"});
               }
               else {
                   resultAndErrors.result.push(response);
               }
           });
           return resultAndErrors;
       });
    }
    else {
        return Promise.resolve([]);
    }
};
于 2016-03-11T15:35:55.760 回答
1

所以有两种方法可以做到这一点。当你有 Promise 时,你通常也会分页 Promise.all 方法,它是 Promise 实现的一部分。在 Angular 中,你会做 $q.all。

因此,您可以执行以下操作:

$q.all(entryIds.map(function(entryId){ return space.cf_space.getEntry(entryId.trim()) })) .then(function(entries){ console.log(entries) })

但是,您似乎正在使用内容丰富的 SDK,其中您还有一个 getEntries 方法,该方法具有查询参数,允许您在一个请求中一次获取多个条目。这将是最理想的事情,因为它会更快。

space.cf_space.getEntries({'sys.id[in]': entryIds.join(',')}) .then(function(entries){ console.log(entries) })

于 2016-03-11T15:43:37.863 回答