我读到,当你从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
只是Promises
和Generators
的糖,它为您完成上述工作,并解开承诺价值并将其传递给您,如下所示:
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);
}