【问题标题】:Promise.resolve() return only one element in nested arrayPromise.resolve() 只返回嵌套数组中的一个元素
【发布时间】:2018-07-12 07:12:16
【问题描述】:

这是我的代码:

search(): Promise<MyModel[]> {
  const query = {
    'action': 'update',
  };

  return new Promise((resolve, reject) => {
    this.api.apiGet(`${API.SEARCH_STUDENT}`, query).then((data) => {
      const a = data.items.map(i => i);
      const b = data.items.map(i => i);
      console.log(a.array1[0].array2.length);  // 1
      console.log(b.array1[0].array2.length);  // 5
      resolve(a);
    }, (error) => {
      reject(error);
    });
  });
}

MyModel 类:

class MyModel {
  ...
  array1: [{
    array2: []
  }]
}

函数apiGet返回的data.items[0].array1[0].array2包含5个元素。但是如果我将 a 或 b 放入 resolve 函数中,它现在只保留第一个元素,就像 sn-p 中的 cmets 一样。

谁能展示我在这里想念的东西?

【问题讨论】:

    标签: javascript angular typescript promise


    【解决方案1】:

    首先我不知道你为什么要在一个承诺中包装一个承诺......为什么你需要这样做 this.api.apiGet 返回一个承诺。

    另外,你为什么要映射?我敢打赌,如果您console.log(data.items) 会返回相同的数据。我想你对你的代码有点困惑。整理代码应该可以为您解决所有这些问题。

    我会做类似下面的事情,现在每次您拨打search 时,您都会获得所有可以在需要时使用的数据。

     search(): Promise<MyModel[]> {
      const query = {
        'action': 'update',
      };
    
      return this.api.apiGet(API.SEARCH_STUDENT, query)
                            .then((data) => data as MyModel[]));
     }
    

    【讨论】:

    • 我把地图函数放在那里只是为了显示如果我把它们放到解析函数中数据会被改变,即使console.log(data.items)resolve(data.items)也是如此。但是你的代码让我意识到它可能就是这么简单。我会试试的。
    • 试试我的代码,我怀疑你得到了同样的结果..让我知道。
    • 我意识到问题来自于在搜索后调用的函数initArray1(),它只在array2 上保留一个元素,因此您的代码会导致相同的结果。但是我真的不知道为什么我在调用initArray1()之前console.log(result_from_search),那个控制台仍然显示函数initArray1(result_from_search)的结果。
    猜你喜欢
    • 2016-10-21
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多