创建对象时返回PromiseValue

时间:2018-12-20 14:50:29

标签: javascript es6-promise

好,所以我四处搜寻,没有发现与此问题有关的东西。

我的问题是这样的->

我使用从api获取的一些信息创建了一个对象(放入数组)。从api获取信息后,我需要调用另一个API以获得有关用户的更多信息。由于有多个用于用户的键,我希望能够通过一个简单的功能将它们内联设置。

我正在做这样的事情->

_item.push({
    Author: setPeople(item.Author.Title),
    Title: item.Title,
    ....
    Requester: setPeople(item.Requester.Title
})

目前,我(完全)获得了诺言,而不是PromiseValue。我知道您通常会执行类似setPeople(name).then(() => {})的操作,但是该操作不适用于我的对象(将密钥设置得太快)。

关于我应该如何处理此问题的任何提示?

更新更多代码。

export const retrieveIrfItems = async (spId) => {
    let spQuery = "SITE" + SpQueryExtend1 + spQueryExpand;

    return new Promise((resolve, reject) => {
        let _items = [];
        axiosApi.get(SiteUrl + spQuery).then((response) => {
            //console.log(response.data.d);
            return response.data.d;
        }).then(async (item) => {
            //let requesterSP = setPeople()
            const createSPUser = async (user) => {
                let spUser;
                console.log("User prop is");
                console.log(user);
                setPeople(user).then((item) => {
                    spUser = item;
                });
                return spUser;
            }

                _item.push({
        Author: setPeople(item.Author.Title),
        Title: item.Title,
        ....
        Requester: setPeople(item.Requester.Title
    })

忽略未使用的功能,我仍在进行测试以找到解决此问题的方法。

通过评论发现了此修复程序。

使用async / await不会帮助我,因为我仍然会收到未决的承诺或未定义的承诺。我必须使用的是->

Requester: await setPeople(item.Requester.Title).then((user) => { return user }), 在我的对象中使用它似乎可行,但是我的问题是……这种方法有多好?如果有很多此行为的字段(当前为5个),是否会使页面变慢...很多?

1 个答案:

答案 0 :(得分:1)

然后您应该尝试类似的事情:

export const retrieveIrfItems = async (spId) => {
  return new Promise((resolve, reject) => {
    let spQuery = "SITE" + SpQueryExtend1 + spQueryExpand;
    let _items = [];
    try{
      const axiosApiItem = await axiosApi.get(SiteUrl + spQuery);
      const item = axiosApiItem.data.d;
      _item.push({
        Author: await setPeople(item.Author.Title),
        Title: item.Title,
        ...
        Requester: await setPeople(item.Requester.Title)
      });
      return resolve(_items);
    }catch(e){
      return reject(e);
    }
  });
}

异步/等待是一种使用异步Promise函数的方法。 async关键字告诉javascript编译器此函数将使用一个或多个异步函数。 await关键字告诉编译器下一个函数调用是异步的,并返回一个Promise。

在您的代码中,您的第一个then()函数应该返回一个诺言,而事实并非如此,这就是为什么无法达到第二个then()的原因。

此外,在您的代码中,您的new Promise不返回任何内容。创建新的Promise时,必须通过调用resolve()reject结束它。

希望有帮助...