我正在向服务器运行ajax POST以接收作为承诺的JSON数据,我正在寻找一种解压缩承诺并获得[[PromiseValue]]本身(实际数据)的方法,而不必使用每次嵌套.then()。从概念上讲,我可以将数据解压缩一次(也许当我返回新的Promise时),以便我可以使用异步等待,然后(希望)在解决数据后开始处理数据?这是我的最小可重现示例:
var data = getData();
useData(data);
async function getData() {
return new Promise((resolve, reject) => {
resolve({one: 1, two: 2, three: 3});
return;
});
};
//This is what I would like to have
async function useData(data) {
await data;
console.log(data); //which I'd like to return the value within [[PromiseValue]]
};
//This is my working version
async function unpackData(data) {
await data.then((res)=> {
console.log(res);
});
};
当前,我运行unpackData()而不是useData(),因为useData()记录了promise本身而不是数据,但是我很喜欢一种让我在等待数据之后使用PromiseValue的方法。线。
答案 0 :(得分:1)
也许我误会了,但是为什么不呢?
async function useData() {
const data = await getData();
console.log(data);
}
如果您想每次重用相同的承诺,则:
async function getData() {
if (!getData.promise) {
getData.promise = new Promise((resolve, reject) => {
resolve({one: 1, two: 2, three: 3});
});
}
return getData.promise;
};
答案 1 :(得分:0)
哦,好了,
async function useData(data) {
const unpackedData = await data;
console.log(unpackedData);
};
答案 2 :(得分:0)
您不能传递数据然后等待它。必须等待数据,然后再传递数据,否则,您传递的是increment
,而不是数据。通过decrement
是不必要的,也不是一个好主意。
Promise
或Promise
都可以做。区别只是语法上的。通常,尽量不要将两者混在一起。
.then()
await
和// either
getData().then(useData);
// or (IIFE-wrapped unless already inside an asyncFunction)
(async function() {
useData(await getData());
})();
都不需要成为asyncFunction,除非它们使用getData()
。
useData()