循环内的异步调用
Async call inside loop
我有以下代码:
$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);
我想在循环内每次调用完成后存储每个响应,并且return作为响应或错误数组。
感谢任何帮助。
方法getEntryreturn的承诺。
参考资料请看这个图书馆:https://github.com/contentful/contentful-management.js
谢谢
您可以为此使用异步库:
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);
});
}
});
getEntriesBySpace
不能 return 您想要的项目数组(异步性)。但是,它可以 return 一个引用所需项目数组的承诺。或者,因为您也想要错误,所以一个对象既包含好的结果又包含错误。
$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([]);
}
};
所以有两种方法可以做到这一点。当你有承诺时,你通常还会分页一个 Promise.all 方法,它是承诺实现的一部分。在 Angular 中,你会做 $q.all.
那么你可以这样做:
$q.all(entryIds.map(function(entryId){
return space.cf_space.getEntry(entryId.trim())
}))
.then(function(entries){
console.log(entries)
})
但是,您似乎在使用 contentful SDK,其中还有一个 getEntries 方法,该方法具有 query parameters 允许您在一个请求中一次获得多个条目。这将是最理想的事情,因为它会更快。
space.cf_space.getEntries({'sys.id[in]': entryIds.join(',')})
.then(function(entries){
console.log(entries)
})
我有以下代码:
$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);
我想在循环内每次调用完成后存储每个响应,并且return作为响应或错误数组。
感谢任何帮助。
方法getEntryreturn的承诺。
参考资料请看这个图书馆:https://github.com/contentful/contentful-management.js
谢谢
您可以为此使用异步库: 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);
});
}
});
getEntriesBySpace
不能 return 您想要的项目数组(异步性)。但是,它可以 return 一个引用所需项目数组的承诺。或者,因为您也想要错误,所以一个对象既包含好的结果又包含错误。
$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([]);
}
};
所以有两种方法可以做到这一点。当你有承诺时,你通常还会分页一个 Promise.all 方法,它是承诺实现的一部分。在 Angular 中,你会做 $q.all.
那么你可以这样做:
$q.all(entryIds.map(function(entryId){
return space.cf_space.getEntry(entryId.trim())
}))
.then(function(entries){
console.log(entries)
})
但是,您似乎在使用 contentful SDK,其中还有一个 getEntries 方法,该方法具有 query parameters 允许您在一个请求中一次获得多个条目。这将是最理想的事情,因为它会更快。
space.cf_space.getEntries({'sys.id[in]': entryIds.join(',')})
.then(function(entries){
console.log(entries)
})