asyn c вызов функции с несколькими возвратами - PullRequest
0 голосов
/ 18 июня 2020

Асинхронная c функция, с которой я имею дело, возвращает несколько значений в массиве

const funcName = async function (arg) {
  ...
  return [val1, val2];
}

Вызывая эту функцию, я обнаружил, что не возможен прямой доступ к отдельным лицам. возвращаемые значения в синтаксисе:

result1 = await funcName(arg)[0]  
result2 = await funcName(arg)[1]

Единственный способ (известный мне до сих пор) это работает, это разбить его на части:

result = await funcName(arg)
result1 = result[0]
result2 = result[1]

Есть ли способ «собрать "возврат непосредственно в одном LO C?
(точно, как r1 = await fn(x)[0])
Это, очевидно, работает для варианта syn c и сохраняет код очень точным, чистым и читаемым.

Дополнительный вопрос: есть ли подсказка, почему прямой доступ к массиву не поддерживается?
Намеренно или просто упущено?

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Можно использовать деструктуризацию массива :

const [val1, val2] = await funcName(arg);
1 голос
/ 18 июня 2020

Синтаксис оператора await:

await UnaryExpression

Это означает, что выражение целиком будет оцениваться перед передачей в await. Вот разбивка того, что происходит, когда await funcName(arg)[0]

  1. funcName(arg) возвращает обещание.

  2. [0] - квадрат в скобках использовано обозначение на обещании . Итак, он получает свойство 0 из объекта обещания.

  3. Так как такого свойства нет, результатом выражения будет undefined.

  4. await вызывается на undefined. Поскольку это не обещание, оно обрабатывается как Promise.resolve(undefined), и поэтому ждать нечего.

  5. Выполнение кода продолжается до фактического объекта обещания с шага 1. завершено.

Вы можете заставить await учитывать возвращенное обещание, если вы заключите правильную часть выражения в скобки или используете его только в выражение, возвращающее обещание:

const simpleAsync = async function () {
  return ["one", "two"];
}

async function main() {
  const foo = await simpleAsync()[0];
  const bar = (await simpleAsync())[0];
//            ^                   ^ 
  const baz = await simpleAsync();

  console.log("foo:", foo);
  console.log("bar:", bar);
  console.log("baz:", baz);
}

main();

Однако, если вы хотите напрямую получить оба возвращаемых значения, вы можете просто использовать деструктуризацию для множественного присваивания :

const simpleAsync = async function () {
  return ["one", "two"];
}

async function main() {
  const [a, b] = await simpleAsync();

  console.log("a:", a);
  console.log("b:", b);
}

main();

Таким образом, await вызывается с фактическим обещанием, а не без обещания, и после , которое разрешено, a и Будет присвоено b переменных.

1 голос
/ 18 июня 2020
const [result1 ,result2]= await funcName(arg)
...