我已经读过,当你从then()返回一个值时,它被包装在一个Promise中并作为一个promise被返回。有没有办法只返回一个值而不是一个promise对象?
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.
}
我知道我要问的是可以通过async / await来实现。但我想正确理解Promises。
由于
答案 0 :(得分:1)
可能有助于了解幕后发生的事情。承诺实际上只是围绕旧回调的语法糖。
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.
}
答案 1 :(得分:0)
标题中问题的简短回答:
没有与vanilla承诺,是与异步等待。
答案很长:
TestPromise()
生成的值只能在使用vanilla Promises时在后续.then
或.catch
内访问。
then
本身每次调用时都会创建并返回Promise Object
,因此您可以将每个then
的Promise解析分开。
说:
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
附加到async函数,如下所示:
someFunction().then(finalValue => console.log(finalValue)
或在另一个异步函数中再次使用它,并通过这样的await
展开:
async function outerAsyncFunction() {
const finalValue = await someFunction();
console.log(finalValue);
}