我有一个使用hnews.getById(id)
返回JSON对象的函数。然后我将承诺中返回的每个故事推送到一个数组。我无法弄清楚如何获得完整的阵列。我需要使用另一个承诺吗?
function updateTopStories() {
var storiesArr = [];
hnews.getIdsInCategory('topstories', 60)
.then(function(ids) {
ids.forEach(function(id) {
hnews.getById(id).then(function(story) {
console.log(story);
storiesArr.push(story);
});
});
});
return storiesArr;
}
var stories = updateTopStories();
console.log(stories); // Empty array
编辑:我需要从storiesArr
updateTopStories();
第二次编辑:我是个白痴。 getById
正在返回一个承诺。我觉得是时候睡觉了。请问mod会删除吗?
我可以从这里拿走它。谢谢大家的期待。
答案 0 :(得分:6)
您在此处调用多个异步进程。处理此问题的一种常用方法是将您的id数组映射到Promise数组,这些Promise都必须在返回之前解析。看看这是否适合你。
function updateTopStories() {
return hnews.getIdsInCategory('topstories', 60).then(function(ids) {
var promises = ids.map(function(id) {
return hnews.getById(id);
});
return Promise.all(promises);
});
}
updateTopStories().then(function(stories) {
console.log(stories);
});
答案 1 :(得分:0)
我不太确定,因为我无法尝试这个,但看起来你在这里遇到了范围问题,试着这样做。
function updateTopStories() {
var tempStoriesArr = [];
hnews.getIdsInCategory('topstories', 60)
.then(function(ids) {
ids.forEach(function(id) {
hnews.getById(id).then(function(story) {
console.log(story);
tempStoriesArr.push(story);
});
});
});
return tempStoriesArr;
}
var StoriesArr = updateTopStories();
console.log(StoriesArr);
答案 2 :(得分:0)
您可以将每次通话的响应重建为:
function updateTopStories() {
var storiesArr = {};
hnews.getIdsInCategory('topstories', 60)
.then(function(ids) {
ids.forEach(function(id) {
storiesArr[id] = [];
hnews.getById(id).then(function(story) {
console.log(story);
storiesArr[id].push(story);
});
});
});
return storiesArr;
}
updateTopStories();
在这里,您要初始化特定id组的每个故事,这是一个数组,然后您可以根据id检索每个故事。
答案 3 :(得分:0)
如果要转换它,您需要返回promise并从“then”块中返回一些内容。 您可以使用Array.prototype.map来转换数组。
function updateTopStories() {
return hnews.getIdsInCategory('topstories', 60)
.then(function(ids) {
return ids.map(function(id) {
return hnews.getById(id).then(function(story) {
console.log(story);
return story;
});
});
});
}
updateTopStories().then(function(arr) {
arr.foreach(function(s) {
console.log('Story:', s);
});
});
答案 4 :(得分:0)
好吧,我明白了:
function return_promise_array(para1):Promise<any>{
return new Promise(async (resolve,reject)=>{
var result=[];
var level1=await get_promise_array();
var process=[];
for(var i=0;i<level1.length;i++){
//after process the item, write the item result into result array
process.push(process_promise_item(level1[i],result));
}
//no way to run promise in for loop,
//but you can create promise function and add it into array,
//then run it in Promise.all()
await Promise.all(process);
resolve(result);
});
}
var result=[];
result=await return_promise_array(para1); //can return as array without error.