从Promise返回完整的数组

时间:2017-01-12 05:30:15

标签: javascript arrays promise

我有一个使用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会删除吗?

我可以从这里拿走它。谢谢大家的期待。

5 个答案:

答案 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.