从异步函数返回实际的承诺

时间:2020-03-29 03:00:41

标签: javascript promise async-await

我了解到异步函数本身会返回Promise。我想知道如何作为已解决的异步函数Promise(可以说是嵌套Promise)的结果返回另一个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()中定义的Promise在提供结果之前解决,但是,这并不是我要寻找的答案。

只要结果不是Promise,“结果”对象就会按预期返回,否则将解决“结果”承诺,并且丢失额外的属性“ test”和“ b”。

1 个答案:

答案 0 :(得分:0)

您正在将它们添加到Promise对象上,当它得到解决时,它仅返回从已解决函数返回的值,因此您丢失了testb,如果需要test和{ {1}}对于从承诺对象返回的值,您需要从resolve函数返回它们。

b