如何让异步/等待等待我的嵌套数组填充
Posted
技术标签:
【中文标题】如何让异步/等待等待我的嵌套数组填充【英文标题】:How to get async/await to wait for my nested array to fill 【发布时间】:2019-06-14 11:41:32 【问题描述】:我遇到了一个问题,我可以看到“arrayOfResults”的数组和数据,但是当我尝试访问数组的某个部分时,它显示未定义。我知道这与异步调用有关,因为如果我将 console.log 设置为超时,它会正确显示。一般来说,我对异步调用很陌生,更不用说等待了。感谢您的帮助!
async function convertToCSV()
var userInput = document.getElementById("thing").value; //value from text area
var arrayOfUserInput = userInput.split('\n').map(str => str.replace(/\s/g, '')); //converts userInput to array and removes whitespace
var arrayOfResults = new Array();
//iterates for how many user inputs are recorded into arrayOfUserInput
for(i = 0; i < arrayOfUserInput.length; i++)
//awaits for each result of retrieve data before inputing into arrayofresults
arrayOfResults[i] = await retrieveData(arrayOfUserInput[i]);
//*****THIS IS THE PART NOT WORKING CORRECTLY****
console.log(arrayOfResults[0][0]);
async function retrieveData (clientRecord)
//pulling data from API
var request = require("request");
var resultsArr = new Array();
var options = method: 'POST',
url: 'blah',
body: ''
request(options, function (error, response, body)
var resData = JSON.parse(body); //stores json response into object
// Do Work here
return resultsArr;
当我 console.log arrayOfResults[0] 我正确接收到所有数据。
当我像上面那样 console.log arrayOfResults [0][0] 时,除非我设置超时以实际等待结果,否则我会得到未定义。
【问题讨论】:
async/await (Promise) 代码和回调代码不能相互配合。承诺request
.
换句话说,retrieveData()
函数必须返回一个将被解析的承诺。
能否简化问题,现阶段读起来有点复杂,如果你能把问题浓缩,你会得到更好的答案。
@RandyCasburn 是来自 Devzer0 的代码/评论在正确的轨道上吗?我尝试实现他的代码,但仍然得到相同的结果。再次感谢大家的宝贵时间!
您似乎发布了敏感/私人信息。请重置您的密码和/或撤销 API 密钥和令牌,因为它们在互联网上发布时被视为已泄露。
【参考方案1】:
return new Promise(function(resolve, reject)
request(options, function (error, response, body)
var resData = JSON.parse(body); //stores json response into object
if(resData.data.policy_number !== undefined)
//...........
else
resultsArr[0] =resData.messages[0];
resolve(resultsArr);
);
);
我整理了 Randy 为您提出的建议,以便您获得更好的想法,
【讨论】:
我尝试实现这一点,但是当我这样做时,我得到了相同的结果。澄清一下:只要我在我的retrieveData 函数中实现promise,convertToCSV 函数就应该正常工作?我在“异步函数retrieveData(clientRecord)”之后插入了“return new Promise”。 不要在异步回调中做事(尤其是会抛出的东西,比如JSON.parse
!)——改用promise回调!或者更好的是,只需使用 request-promise
包而不是手动承诺。【参考方案2】:
为了阐明 hack,下面是一个简单的示例,其中包含更生动的 async/await 方法。
async function addOneInArray()
let arr = [1, 2, 3, 4, 5];
let sumArr = new Array();
for (let i = 0; i < arr.length; i++)
sumArr[i] = await add(arr[i]);
return sumArr;
function add(number)
return new Promise((resolve, reject) =>
setTimeout(() => resolve(number + 1) , 100)
)
addOneInArray().then((result)=>
console.log("Sum element of an Array by 1 - ",result);
);
【讨论】:
以上是关于如何让异步/等待等待我的嵌套数组填充的主要内容,如果未能解决你的问题,请参考以下文章