Node+Mongo构建Netlify无服务器函数:为何返回Promise而非预期数组?
问题:为何得到的是Promise而非预期的数组?
开发场景
我正在使用Node与Mongo进行开发,尝试基于Mongo记录,通过Netlify无服务器函数发起一系列并行请求,目前的代码如下:
paralellNum = 2; const filter = { 'Parcel': { $regex: '[0-9]' }, 'UseCode': { $exists: false } }; let records = await collection.find(filter).limit(firstNum).toArray() console.log('number of records selected from db: ', records.length); const fetchURL = (obj) => fetch('http://localhost:8888/.netlify/functions/meta1', { method: 'POST', body: JSON.stringify(obj), headers: { 'Content-Type': 'application/json' } }); let outputArray = []; for (let i = 0; i < (paralellNum-1); i++) { const record = records.pop(); const obj = {"_id":record._id,"apn":record.Parcel}; outputArray.push(fetchURL(obj)); } console.log(outputArray);
实际输出
原本预期outputArray中包含构造好的fetch请求,但实际得到的却是:
1) [Promise] 0: Promise {[[PromiseState]]: 'pending', [[PromiseResult]]: undefined, Symbol(async_id_symbol): 59, Symbol(trigger_async_id_symbol): 58} length:1
请问为何我得到的是Promise而非预期的数组?
解答
这是因为**fetch本身就是异步函数**,只要调用它,就会立刻返回一个Promise对象,而不是直接返回请求结果或者“构造好的请求”。
你代码里的fetchURL(obj)本质就是调用fetch,所以每次push到数组里的都是fetch返回的Promise,这就导致outputArray是一个装着Promise的数组,而非你想象的“请求实例”数组。
如果想要拿到这些并行请求的最终结果,需要用Promise.all等待所有Promise完成,比如:
// 等待所有并行请求完成 const results = await Promise.all(outputArray); console.log(results); // 这里才是请求返回的结果数组
另外你代码里的循环条件是i < (paralellNum-1),当paralellNum=2时,循环只会执行1次,所以数组里只有1个Promise,这和你输出的length:1对应。如果想发起2个并行请求,应该把条件改成i < paralellNum。
内容的提问来源于stack exchange,提问作者user1592380
相关产品推荐
相关产品推荐

