【问题标题】:Calling async function return Promise object with numbers for property names调用异步函数返回 Promise 对象,其属性名称为数字
【发布时间】:2018-02-07 05:47:04
【问题描述】:

我正在调用此代码:

Permissions.check('photo')
      .then(response => {
        ...
      });

这里我可以使用响应对象来检查值。
但我想用 await 来称呼它:

async function test() {
  let test = await Permissions.check('photo');
  return test;
}
...
let result = test();

但这会给我返回如下所示的 Promise 对象:

Promise {_40: 0, _65: 0, _55: null, _72: null}

我通常在response 中获得的价值在这里我获得result._55
我该怎么做才能得到合适的对象?

【问题讨论】:

  • 如果您将awaitthen 结合使用,它将起作用。我认为这是一个不好的做法。试试let test; await Permissions.check('photo').then((response) => test=response);
  • 我之前问过一个类似的问题,这是接受的答案中非常有用的信息:stackoverflow.com/questions/45765114/…

标签: javascript react-native es6-promise


【解决方案1】:

这里有几个选项:

  1. 坚持你已经在做的事情。

    function main() {
      Permissions.check('photo')
        .then(response => {
          ...
        });
    }
    main();
    
  2. 如果你想做类似let result = Permissions.check() 的事情,其中​​Permissions.check() 返回一个promise,你实际上需要(a) 使用await 关键字和(b) 将let result 语句放在async 函数中。

    async function main() {
      let result = await Permissions.check('photo');
    }
    main();
    

我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您是否希望能够以这样的同步方式使用test

    let result = test();
    result._55; // ...
    

    很抱歉让你失望了,但那是行不通的。

    异步函数不会将异步操作转换为同步操作。异步函数返回一个将值包装在 return ... 语句中的承诺。这意味着您的test 函数相当于:

    function test() {
      return Permissions.check('photo').then(result => result);
    }
    

    ...这是没有意义的,因为您现在必须像这样使用它:

    test().then(response => {
      response._55; // ...
    });
    

    坚持你的第一个解决方案。

    【讨论】:

    • 这是评论还是答案?
    • @KhalilKhalaf,不,OP 从未说过第一个解决方案不起作用。他们只是期望异步函数test 能够提供一种更好的(“同步”)访问result 对象的方式。我解释了test 不会返回这个result 对象,而是一个包装这个对象的承诺。
    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 2017-10-16
    • 1970-01-01
    • 2019-01-27
    • 2013-05-30
    • 2018-04-13
    • 2019-10-23
    相关资源
    最近更新 更多