是否可以从 then() 返回一个值?



我读到,当你从then((返回一个值时,它被包装在一个承诺中,并作为一个承诺返回。有没有办法只返回一个值而不是一个承诺对象?

function TestPromise() {
//someAsyncFunction returns a Promise.
return someAsyncFunction();
}
//Assume valueFromPromise = 2;
//After the addition newValue becomes 3
//And we return 3 instead of 3 wrapped up in a Promise.
function someFunction() {
return latestValue = TestPromise().then(valueFromPromise => {
newValue = valueFromPromise + 1;
return newValue;
});
}
function main() {
let value = someFunction();
//Use value here to do something.
}

我知道我所要求的可以通过异步/等待来实现。但我想正确理解应许。

谢谢

了解引擎盖下发生的事情可能会有所帮助。承诺实际上只是围绕旧回调的语法糖。

function TestPromise() {
//someAsyncFunction returns a Promise.
return someAsyncFunction();
}
function someAsyncFunction() {
return new Promise(function(resolve, reject) {
fetchSomeValue()
.then(function(someValue) {
resolve(someValue);
});
}

Promise调用resolve()回调之前,无法获取该数据。async/await真的很干净,我不确定你为什么要避免它。

function TestPromise() {
//someAsyncFunction returns a Promise.
return someAsyncFunction();
}
//Assume valueFromPromise = 2;
//After the addition newValue becomes 3
//And we return 3 instead of 3 wrapped up in a Promise.
async function someFunction() {
const valueFromPromise = await TestPromise();
return valueFromPromise + 1;
}
async function main() {
let value = await someFunction();
//Use value here to do something.
}

标题中问题的简短回答:

与香草承诺,是与异步等待。

长答案:

TestPromise()产生的价值只能在使用原版承诺时在后续.then.catch中访问。

每次调用Promise Object时,then本身都会创建和返回一个,因此您可以将每个then的承诺决议分开。

说:

const p = new Promise((resolve) => {
setTimeout(() => resolve(1), 2000);
}).then((val) => {
console.log(val);
return new Promise((resolve) => {
setTimeout(() => resolve(2), 1000);
})
}).then((val) => {
console.log(val);
return 3
});
p.then(console.log);

Async/Await只是PromisesGenerators的糖,它为您完成上述工作,并解开承诺价值并将其传递给您,如下所示:

async function someFunction() {
const valueFromPromise = /* here it passes the unwrapped value back  after await */await TestPromise();
return valueFromPromise + 1;
}

但是异步函数本身仍然是一个承诺,所以你必须接收它的值,要么将另一个then附加到异步函数,如下所示:

someFunction().then(finalValue => console.log(finalValue)

或者再次在另一个异步函数中使用它,并像这样解开await

async function outerAsyncFunction() {
const finalValue = await someFunction();
console.log(finalValue);
}

最新更新