node.js - 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 中同步运行一些代码,例如您可以使用 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();
推荐阅读
- rust - 我们可以实现 Command 结构的 Copy 和 Clone 特征吗?
- python - 在 PyGMO 中访问代数和退出标志
- c++builder - C ++ Builder:“突出显示大括号对”选项混乱文本选择
- python - XPATH,从 Flex 容器中选择特定的有效值
- r - 用 R 中的最后一个或下一个非 NA 值填充 NA
- visual-c++ - 如何从套接字winsock2获取套接字状态
- spring-boot - 使用 SpringDoc OpenAPI,Double 和其他非原始数字不会被标记为可为空
- java - 如何在 Java 中实现一个函数,该函数返回公司内部员工的层次结构
- android - 如何拥有具有相同 SHA-1 的不同 Android 应用程序
- flutter - Flutter:创建带有可选身体部位的 BodyMap Widget