这已经在几个线程中处理过,但仍然无法解决这个问题,可能是因为我对节点全新,并且为java程序员进行转换通常需要更长的时间。
基本上必须这样做:
var data [];
fetchData() // populates data array;
//for each data element
fetchAdditionalData(data);
doSomethingWithAdditionalData();
我认为这会同步执行,但不会出现,任何想法如何通过节点快速解决?
感谢
答案 0 :(得分:1)
node.js中的代码是同步执行的,除非它需要资源。如果需要资源,节点引擎将同时执行其他操作。
如果获取数据正在使用文件系统的网络/文件/需要等待的任何资源,则代码将是异步的。通常,将代码视为异步更安全。
处理这种问题的最佳方法是回调或承诺。回调已经显示,所以我将使用promises。如果你使用fetch,你通常会有一个承诺。例如,使用SW API:
//this function return a promise
function fetchData() {
return fetch('https://swapi.co/api/people/3',{mode:'cors'})
.then(resp => resp.json()) //just want the json from the response
.then(respJson => {
console.log("result of fetchData is " + JSON.stringify(respJson))
return respJson
})
}
function doSomeStuff(x) {
console.log("Doing some stuff with anArray : ")
console.log(x)}
fetchData().then(data => {
//here we are sure that anArray is equal to the films we fetched
// because of the then
let anArray = data.films
doSomeStuff(anArray)
})
//if you come from Java the async/await syntax might be more readable.
//It is just syntaxic sugar for promises
async function fetchDataAsync() {
let anArray2 = []
const swResp = await fetch('https://swapi.co/api/people/3',{mode:'cors'})
const swJSON = await swResp.json()
console.log("async result is" + JSON.stringify(swJSON))
anArray2 = swJSON.films
doSomeStuff(anArray2)
}
fetchDataAsync()
答案 1 :(得分:0)
您可以使用回调方法,这样您就可以同步运行您的功能。
下面是一个函数fetchData,它将返回一个数组作为回调
function fetchData(callback) {
var data = [];
/*
* Fetch the array as required, either through a function or API
* and push it to the data array
* sample function
function generate() {
for(var i = 0; i < 100; i++) {
data.push(i + 1);
}
callback(data)
}
*/
}
fetchData(function(data) {
for (var i = 0; i < data.length; i++) {
// You can do something else here too
}
})
我希望这能解决你的问题