RSVP.js - 数组上的多个异步函数调用
RSVP.js - Multiple asynchronous function calls on array
我有一个包含文件列表的 REST 调用的结果。每个文件都有我必须提取并放置在新数组中的属性。这很简单,只需一个简单的循环即可轻松完成。我需要提取的三个属性可以直接访问,而其他三个属性属于 HATEOAS 类型,换句话说,对于结果中的每个文件,我必须进行另外三个异步调用来检索它的值。
我的第一直觉是使用 RSVP.all()
来处理我的承诺,并使用 map
将新数组中的项目映射到原始文件列表中的相应属性,但我想不通了解如何实现这一目标。
我想实现如下所示,但我不知道如何获取 itemList
中当前映射项的索引,以包含来自 fileList
的正确文件。我该怎么做?
旁注,如果我 RSVP.all()
的使用方式有误,我很乐意收到提示!
function createItemList(fileList) {
var promise = new RSVP.Promise(function(resolve, reject) {
var itemList = [];
//For each file in fileList, get the directly accessible properties
//and push it to a new array
for (var i = 0, file; file = fileList[i]; i++) {
currentItem.Name = file.Name;
currentItem.LastModified = new Date(file.TimeLastModified).format("dd-MM-yyyy hh:mm:ss");
currentItem.Version = file.MajorVersion + "." + file.MinorVersion;
itemList.push(currentItem);
}
//This is where it starts to get messy...
//I want to map each item in the new itemlist to the corresponding properties
//in the fileList. If I can include the corresponding file somehow, I could set the
//data in the method 'getModifiedBy' and similar. I believe this should work,
//but I have no idea how I can achieve this.
var modifiedBy = itemList.map(function(item) {
return getModifiedBy(item, fileList[INDEX]);
});
var checkedOutBy = itemList.map(function (item) {
return getCheckedOutBy(item, fileList[INDEX]);
});
var eventDate = itemList.map(function (item) {
return getEventDate(item, fileList[INDEX]);
});
var promises = {
promisesModifiedBy: modifiedBy,
promisesCheckedOutBy: checkedOutBy,
promisesEventDate: eventDate
};
RSVP.all(promises)
.then(function() {
resolve(itemList);
});
});
return promise;
}
在 itemlist
上仅使用一张地图,returns 是您的 3-属性-对象的 Promise。为单个项目使用专用的辅助函数。
顺便说一句,new RSVP.Promise
你正在使用 deferred antipattern,而绝对没有理由 - RSVP.all()
已经 returns 你得到了结果承诺。
function createItemList(fileList) {
return RSVP.all(fileList.map(createItem));
}
function createItem(file) {
// get the directly accessible properties
var currentItem = {};
currentItem.Name = file.Name;
currentItem.LastModified = new Date(file.TimeLastModified).format("dd-MM-yyyy hh:mm:ss");
currentItem.Version = file.MajorVersion + "." + file.MinorVersion;
return RSVP.hash({
modifiedBy: getModifiedBy(currentItem, file),
checkedOutBy: getCheckedOutBy(currentItem, file)
eventDate: getEventDate(currentItem, file)
}).then(function(asyncprops) {
// somehow mix the asyncprops with the currentItem
return item; // into a result item
});
}
我有一个包含文件列表的 REST 调用的结果。每个文件都有我必须提取并放置在新数组中的属性。这很简单,只需一个简单的循环即可轻松完成。我需要提取的三个属性可以直接访问,而其他三个属性属于 HATEOAS 类型,换句话说,对于结果中的每个文件,我必须进行另外三个异步调用来检索它的值。
我的第一直觉是使用 RSVP.all()
来处理我的承诺,并使用 map
将新数组中的项目映射到原始文件列表中的相应属性,但我想不通了解如何实现这一目标。
我想实现如下所示,但我不知道如何获取 itemList
中当前映射项的索引,以包含来自 fileList
的正确文件。我该怎么做?
旁注,如果我 RSVP.all()
的使用方式有误,我很乐意收到提示!
function createItemList(fileList) {
var promise = new RSVP.Promise(function(resolve, reject) {
var itemList = [];
//For each file in fileList, get the directly accessible properties
//and push it to a new array
for (var i = 0, file; file = fileList[i]; i++) {
currentItem.Name = file.Name;
currentItem.LastModified = new Date(file.TimeLastModified).format("dd-MM-yyyy hh:mm:ss");
currentItem.Version = file.MajorVersion + "." + file.MinorVersion;
itemList.push(currentItem);
}
//This is where it starts to get messy...
//I want to map each item in the new itemlist to the corresponding properties
//in the fileList. If I can include the corresponding file somehow, I could set the
//data in the method 'getModifiedBy' and similar. I believe this should work,
//but I have no idea how I can achieve this.
var modifiedBy = itemList.map(function(item) {
return getModifiedBy(item, fileList[INDEX]);
});
var checkedOutBy = itemList.map(function (item) {
return getCheckedOutBy(item, fileList[INDEX]);
});
var eventDate = itemList.map(function (item) {
return getEventDate(item, fileList[INDEX]);
});
var promises = {
promisesModifiedBy: modifiedBy,
promisesCheckedOutBy: checkedOutBy,
promisesEventDate: eventDate
};
RSVP.all(promises)
.then(function() {
resolve(itemList);
});
});
return promise;
}
在 itemlist
上仅使用一张地图,returns 是您的 3-属性-对象的 Promise。为单个项目使用专用的辅助函数。
顺便说一句,new RSVP.Promise
你正在使用 deferred antipattern,而绝对没有理由 - RSVP.all()
已经 returns 你得到了结果承诺。
function createItemList(fileList) {
return RSVP.all(fileList.map(createItem));
}
function createItem(file) {
// get the directly accessible properties
var currentItem = {};
currentItem.Name = file.Name;
currentItem.LastModified = new Date(file.TimeLastModified).format("dd-MM-yyyy hh:mm:ss");
currentItem.Version = file.MajorVersion + "." + file.MinorVersion;
return RSVP.hash({
modifiedBy: getModifiedBy(currentItem, file),
checkedOutBy: getCheckedOutBy(currentItem, file)
eventDate: getEventDate(currentItem, file)
}).then(function(asyncprops) {
// somehow mix the asyncprops with the currentItem
return item; // into a result item
});
}