按顺序调用节点功能

时间:2017-11-02 08:56:07

标签: node.js

这已经在几个线程中处理过,但仍然无法解决这个问题,可能是因为我对节点全新,并且为java程序员进行转换通常需要更长的时间。

基本上必须这样做:

var data [];
fetchData() // populates data array;

//for each data element

fetchAdditionalData(data);

doSomethingWithAdditionalData();

我认为这会同步执行,但不会出现,任何想法如何通过节点快速解决?

感谢

2 个答案:

答案 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

  }
})

我希望这能解决你的问题