Возврат фактического обещания из функции asyn c - PullRequest
0 голосов
/ 29 марта 2020

Я понимаю, что функции asyn c изначально возвращают Promise. Я хотел бы знать, как вернуть еще одно обещание в результате разрешенного обещания функции asyn c (так сказать, вложенного Promise). Если это невозможно, меня интересуют причины этого.

Ниже приведен пример кода, в котором некоторые свойства объекта потеряны.

function B() {
    return new Promise((resolve) => {
        setTimeout(() => resolve('B resolved'), 10);
   })
}

async function A() {
    const result = new Promise((resolve) => { setTimeout(() => resolve('A resolved'), 30); }); 
    result.test = 'test';
    result.b = await B();
    return result;
}

const a = A();
console.log('a.b', a.b); // expected undefined, correct
console.log('test1', a.test); // expected undefined, correct

a.then((a_data) => {
    console.log('a_data', a_data); // expected Promise constructed in A(), actually 'A resolved'
    console.log('a_data.b', a_data.b); // expected 'B resolved', actually undefined
    console.log('a_data.test', a_data.test); // expected 'test', actually undefined
	
    // this code expected to be allowed, but .then is not a member of a_data since it's not a promise
    // a_data.then((data) => {
    //     console.log(data); // expected 'A resolved'
	// });
});

Я также понимаю, что в большинстве случаев было бы лучше дождаться разрешения Обещания, определенного в A (), прежде чем предоставлять результат, однако это не ответ Я ищу.

Объект 'result' возвращает ожидаемый результат, если он не является Promise, в противном случае обещание 'result' разрешается, а дополнительные свойства 'test' и 'b' теряются. .

1 Ответ

0 голосов
/ 29 марта 2020

Вы добавляете их в объект обещания, и когда это разрешается, оно просто возвращает значение, возвращенное из разрешенной функции, поэтому вы потеряли test и b, если вам нужно test и b для значения, возвращенного из обещанный объект вам нужно вернуть из функции разрешения.

function B() {
  return new Promise((resolve) => {
    setTimeout(() => resolve('B resolved'), 1000);
  })
}

async function A() {
  const result = new Promise((resolve) => {
    setTimeout(() => resolve({
      test: "test",
      b:  B()
    }), 3000);
  });

  return result;
}

const a = A();
console.log('a.b', a.b); // expected undefined, correct
console.log('test1', a.test); // expected undefined, correct

a.then((a_data) => {
  console.log('a_data', a_data); // expected Promise constructed in A(), actually 'A resolved'
  console.log('a_data.b', a_data.b.then(v=> console.log(v))); // expected 'B resolved', actually undefined
  console.log('a_data.test', a_data.test); // expected 'test', actually undefined

  // this code expected to be allowed, but .then is not a member of a_data since it's not a promise
  // a_data.then((data) => {
  //      console.log(data); // expected 'A resolved'
  // });
});
...