首页 > 解决方案 > NodeJS中如何同步调用异步代码

问题描述

我编写了以下代码来完成这项工作......但它只调用一次。但我想多次调用该列表中的所有对象。是否可以在nodejs中同步调用任何代码。

    async function processObjs(){
          var response = "done";
        for(var i = 0; i < objectsToProcess.length; ++i) {
            var obj = objectsToProcess[i];
            await processObject(obj);
            console.log("done for : " + obj);
        }
        return response;
      }

      function processObject(objectType){
        var filePath = objectType+".csv";
        return newPromise(objectType,filePath);
      }

      function newPromise(objectType,filePath){
          return new Promise(function (resolve){
      //following code should run synchronously
            dataStore= new DataLakeStore(objectType);
            let firstPage = true;
            console.log("start processing for object :"+objectType);
            dataStore.search(qry).forEachPage(page => {
                const jsonToWrite = page.hits.map(record => {
                  return record._source.doc;
                });
                let csvData;
                let flag;
                if (firstPage) {
                  firstPage = false;
                  flag = "ax+";
                  csvData = json2csv(jsonToWrite);
                }else{
                  flag = "a";
                  csvData = json2csv(jsonToWrite, { header: false }) + "\n";
                }
                fs.writeFileSync(filePath, csvData, { flag });
              });
              resolve("DONE");
          });

      }

      processObjs().then(function (response) {
        console.log("Completed FOR All " + response);
      })

标签: node.js

解决方案


可以在 Node.js 中同步运行一些代码,例如您可以使用 fs.readFileSync 同步读取文件。但是在大多数情况下你不应该,记住大多数 Node.js I/O 是异步的是有原因的。

大多数 API 使用这种异步模式,确保函数调用不会阻塞。使用这些函数调用,例如上面的示例,您不能同步运行它们,但是您可以使用 asynch / await 模式为您提供与同步函数相同的语法。

// Simulate say a DB or REST call here.. 
function asynchReadSomeData(callback) {
    setInterval(() => {
        callback("OK");
    }, 2000);  
}

function asynchReadSomeDataPromise() {
    return new Promise((resolve) => {
        asynchReadSomeData((result) => resolve(result));
    });
}

async function testAwait() {
    /* We can use very similar syntax to a synchonous function call here..*/
    console.log("Calling asynchReadSomeDataPromise, waiting for result...");
    let result = await asynchReadSomeDataPromise();
    console.log("Result: ", result);
}

testAwait();


推荐阅读