承诺:链接方法并使用两个返回的对象吗?

时间:2019-03-27 17:30:23

标签: javascript es6-promise

我有此代码:

return (entity.User.getProjects(req.user.id, ....))
    .then((list) => {
        // party with list object!
        return {
            list: list
        }
    }

我也想调用另一个方法entity.Tag.getAllForUser,它返回一个tags列表。

(更新:我只需要使用Promise即可-我不能使用async / await。)

此代码不起作用-它说listtag都未定义:

return (entity.User.getProjects(req.user.id, ....))
    .then((list) => entity.Tag.getAllForUser(req.user.id))
    .then((list, tags) => {
        // party with both list and tags objects!
        return {
            list: list,
            tags: tags
        }
    }

我还尝试将第二个呼叫链接到第一个:

return (
    entity.User.getProjects(req.user.id, ....).then((list) => 
    entity.Tag.getAllForUser(req.user.id))
 ).then((list, tags) => {
    // party with both list and tags objects!
    return {
        list: list,
        tags: tags
    }
}

但是再次说list是未定义的。 能做什么

4 个答案:

答案 0 :(得分:0)

只需使用let list = await entity.User.getProjects(req.user.id, ....)) let tags = await entity.Tag.getAllForUser(req.user.id)) return { list: list, tags: tags } }

Async/Await

如果您不能使用Promise.all([ entity.User.getProjects(req.user.id), entity.Tag.getAllForUser(req.user.id); ]).then(([list,tag])=>{ // do here whatever you want }) (即使我建议使用它们),也可以使用promise.all

<a>

答案 1 :(得分:0)

这里最好的解决方案是Promise.all,它接受​​一个Promise列表,并返回一个解析值列表:

return Promise.all([
  entity.User.getProjects(req.user.id),
  entity.Tag.getAllForUser(req.user.id);
])
  .then(([ list, tags ]) => {
    // Party!
    return { list, tags };
  });

使用asyncawait的强制性建议:

let [ list, tags ] = await Promise.all([
  entity.User.getProjects(req.user.id),
  entity.Tag.getAllForUser(req.user.id);
]);

return { list, tags };

答案 2 :(得分:0)

这取决于您是否要求独立

在独立请求上获取多个解析值:

假设我有getUsers()getCities(),并且两者都是独立的(您不需要用户进入城市,反之亦然)。然后,您可以使用Promise.all

Promise.all([getUsers(), getCities()])
.then(result => {
  // result here will be an array of two elements:
  // result[0] -> what getUsers resolves
  // result[1] -> what getCities resolves 
});

根据相关请求获取多个解析值:

如果您有getUser(),它返回一个用户,然后是getCouple(user),它返回一个与用户相关的人,然后是getHouse(user1, user2),这恰好需要他们都可以执行以下操作:

const user = getUser();
const couple = user.then(u => getCouple(u)); // you can reuse a promise. This does not trigger then handler again, if
// the promise is settled will yield the settle value.
const house = user.then(u => {
  return couple.then(c => {
    return getHouse(u,c);
  });
});
使用async / await会变得更好:
async function() {
  const user = await getUser();
  const couple = await getCouple(user);
  const house = await getHouse(user, couple);
}

答案 3 :(得分:-1)

回答我自己的问题。请不要删除,因为这可能对其他人有用!

return (entity.User.getProjects(req.user.id, ....))
    .then((list) => Promise.all([list, entity.Tag.getAllForUser(req.user.id)]))
    .then(([list, tags]) => {
        // party with both list and tags objects!
        return {
            list: list,
            tags: tags
        }
}