我正在探索Promise.all()的使用,但我不知道为什么它没有给我预期的结果。我试着一步一步地说明它。
让我们看看我的代码:
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, 'foo');
});
var apiCall = async () =>{
// to simulate a api call that will response after 5 sec
setTimeout(() => {return 1000}, 5000);
}
Promise.all([p2,p3,apiCall()]).then(values => {
console.log(values); // [3, 1337, undefine], but I expect [3, 1337, 1000]
});
apiCall().then((response)=>{console.log(response)})
在我的理解中,async函数会立即返回一个Promise,这就是Promise。一切都将等待。
所以我想,
.then(values => {
console.log(values); // [3, 1337, undefined]
});
将在5秒后执行。
但是已经在2秒内输出如下,而不是[3,1337,1000]
undefined
[ 1337, 'foo', undefined ]
我不知道问题出在哪里,我想
apiCall().then((response)=>{console.log(response)})
会给我"1000"而不是undefined
新编辑收集了你们的答案后,我尝试了这个。
根据我的理解,setTimeout也是一个async,它会像任何其他承诺一样自动返回一个承诺。
所以,基于这种理解,我写了下面的代码。但这行不通。我理解使用承诺构造函数将解决问题。但是我不知道这个例子出了什么问题var apiCall = async () =>{
// to simulate a api call that will response after 5 sec
const a = setTimeout(() => {return 1000}, 5000);
return a
}
您的api调用没有正确返回值。尝试返回一个在超时
后解析的承诺var apiCall = async () =>{
// to simulate a api call that will response after 5 sec
return new Promise(resolve => {
setTimeout(() => {resolve(1000)}, 5000);
});
}
简而言之,您没有做任何会使apiCall
在解析承诺之前等待超时的事情。
var apiCall = async () =>{ // to simulate a api call that will response after 5 sec setTimeout(() => {return 1000}, 5000); }
- 这是一个
async
函数,所以它返回一个promise。 - 它首先调用
setTimeout
- 然后它到达最后没有击中
return
语句,因此将承诺解析为undefined
- 5秒后超时结束,调用传递给
setTimeout
的函数。这个函数返回1000
。setTimeout
对回调的返回值不做任何处理。
要从回调API(如setTimeout)中获得承诺,您需要使用new Promise
(正如您对p3
所做的那样)。
async
关键字仅在允许您使用await
关键字时才有用。事实上,它使一个函数返回一个承诺应该被认为是使await
工作所需的副作用。
await
是管理现有承诺的工具。
您在apiCall
中没有返回任何内容。当使用setTimeout
时,指定一个回调函数,该函数将在给定时间后执行。你在回调中返回什么基本上不重要。
你应该让apiCall
函数返回一个新的Promise,它在setTimeout
回调中解析。