如何让异步/等待等待我的嵌套数组填充

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);
);

【讨论】:

以上是关于如何让异步/等待等待我的嵌套数组填充的主要内容,如果未能解决你的问题,请参考以下文章

PCL中的MVVMCross异步和等待方法

如何等待数据被填充到反应中?

在循环中等待嵌套的 Promise

使单元测试等待另一个方法中的异步调用

异步/等待:异步嵌套函数是不是需要自动等待上一级?

如何在猫鼬中异步填充嵌套对象?