我在使用 promises 控制方法流程时遇到问题:
//FIND CHECKED OUT FILES
getCheckedOutFiles = function () {
console.log('Get checked out files');
var d = $q.defer();
// Store final results and pass to then callback
var checkedOutFiles = window.x = [];
// Promise, returns collection with all sites
SiteService.getAllSites()
.then(sites => {
// For each site get lists then get items matching filter
sites.forEach(function (site) {
var web = new $pnp.Web(site.url);
return web.lists
.filter("BaseTemplate eq 101")
.get() // Returns promise with all lists matching filter
.then(lists => {
// Go through each list and find matching item
lists.forEach(function (list) {
web.lists.getByTitle(list.Title).items
.filter("CheckoutUser ne null")
.expand("File, File/Author, File/ModifiedBy, File/CheckedOutByUser")
.get() // Returns promise with all items matching filter
.then(files => {
// Loop through each item, get properties, add to collection
files.forEach(function (f) {
var fileObject = {
fileName: f.File.Name,
fileUrl: f.File.ServerRelativeUrl,
absoluteUrl: f.File.ServerRelativeUrl,
checkedTo: f.File.CheckedOutByUser.Title,
modified: f.Modified,
modifiedBy: f.File.ModifiedBy.Title,
createdBy: f.File.Author.Title,
created: f.Created,
version: f.File.UIVersionLabel
};
// Add file to collection
checkedOutFiles.push(fileObject);
}, this);
})
.catch(e => {
console.log(e);
});
});
// "Ideally" - When all files retrieved return collection of results
d.resolve(checkedOutFiles);
return null;
})
.catch(e => {
console.log(e);
});
}, this);
return null;
});
return d.promise;
};
// Returns promise with all checkedout file
getCheckedOutFiles().then(files => {
console.log("RESULTS", files);
d.resolve(files);
});
我注意到 console.log("RESULTS", files);
将在调用完成之前打印出来。调用完成后,window.x
将包含预期的数据。
最佳答案
使用Promise.all()等待创建的所有 promise ,然后解决父级 promise
像这样(未测试)
//FIND CHECKED OUT FILES
getCheckedOutFiles = function () {
console.log('Get checked out files');
var d = $q.defer();
// Store final results and pass to then callback
var checkedOutFiles = window.x = [];
// Promise, returns collection with all sites
SiteService.getAllSites()
.then(sites => {
// For each site get lists then get items matching filter
sites.forEach(function (site) {
var web = new $pnp.Web(site.url);
return web.lists
.filter("BaseTemplate eq 101")
.get() // Returns promise with all lists matching filter
.then(lists => {
let promises = []
// Go through each list and find matching item
lists.forEach(function (list) {
let prom = web.lists.getByTitle(list.Title).items
.filter("CheckoutUser ne null")
.expand("File, File/Author, File/ModifiedBy, File/CheckedOutByUser")
.get() // Returns promise with all items matching filter
.then(files => {
// Loop through each item, get properties, add to collection
files.forEach(function (f) {
var fileObject = {
fileName: f.File.Name,
fileUrl: f.File.ServerRelativeUrl,
absoluteUrl: f.File.ServerRelativeUrl,
checkedTo: f.File.CheckedOutByUser.Title,
modified: f.Modified,
modifiedBy: f.File.ModifiedBy.Title,
createdBy: f.File.Author.Title,
created: f.Created,
version: f.File.UIVersionLabel
};
// Add file to collection
checkedOutFiles.push(fileObject);
}, this);
})
.catch(e => {
console.log(e);
});
promises.push(prom)
});
// "Ideally" - When all files retrieved return collection of results
Promise.all(promises).then(function(){
d.resolve(checkedOutFiles);
})
return null;
})
.catch(e => {
console.log(e);
});
}, this);
return null;
});
return d.promise;
};
// Returns promise with all checkedout file
getCheckedOutFiles().then(files => {
console.log("RESULTS", files);
d.resolve(files);
});
关于javascript - 使用循环中的嵌套 promise 控制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46046487/