Как преобразовать Асинхронный в Синхронный в node js - PullRequest
0 голосов
/ 04 апреля 2020

Я ладья ie в nodejs. И теперь у меня возникла проблема с асинхронным и синхронным в node js.

Вот мой код:

var time_begin = Date.now();
console.log("begin time:" + time_begin);

arr_a = ['a', 'b', 'a', 'b', 'a', 'b']

async function iterTrans (arr_a) {

    var txs_arr_tmp = [];
    for(let aInfo of arr_a) {
        var fs = require('fs');
        if (aInfo == "a") {
            fs.readFile("./debug.json", function (error_file, data_file) {
                if (error_file) {
                    console.log(error_file)
                } else {
                    txs_arr_tmp.push("a");
                }
            });

        } else {
            txs_arr_tmp.push("b");
        }
    }
    return txs_arr_tmp;
}

iterTrans(arr_a).then((txs_arr_tmp) => {

    var content_str = JSON.stringify(txs_arr_tmp);
    console.log(content_str);
})

Я предполагаю, что консоль будет печатать:

["a","b","a","b","a","b"]

Но на самом деле я получил:

["b","b","b"]

Я изучил и попробовал некоторые методы об асинхронном и синхронном, но я не сделал успешно. И я должен использовать асинхронный метод в readFile.

Итак, как я могу получить ["a", "b", "a", "b", "a", "b"]? Кто может дать мне совет?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Вот как я подхожу к написанию функции. Поскольку ваша версия Node.js не поддерживает fs.promises API , вы можете использовать util.promisify() для преобразования fs.readFile() из API обратного вызова для API обещаний, затем используйте Array.prototype.map() для создания массива обещаний и await readFile(), вызываемых параллельно с Promise.all():

const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);

const time_begin = Date.now();
console.log("begin time:" + time_begin);

const arr_a = ['a', 'b', 'a', 'b', 'a', 'b'];

async function iterTrans (arr_a) {
  // array map allows parallel asynchronicity
  const txs_arr_tmp_promises = arr_a.map(async aInfo => {
    // use early return (to avoid nesting large blocks inside if statements)
    if (aInfo !== 'a') return 'b';

    // let await throw here if file error occurs
    const data_file = await readFile('./debug.json');
    return 'a';
  });

  return Promise.all(txs_arr_tmp_promises);
}

iterTrans(arr_a).then(txs_arr_tmp => {
  const content_str = JSON.stringify(txs_arr_tmp);
  console.log(content_str);
}).catch(error => {
  // handle errors here
  console.log(error);
});
1 голос
/ 04 апреля 2020

Вы не можете преобразовать что-то asyn c в syn c, но вы можете заставить свою реализацию rest ждать, пока asyn c fun c завершится

var time_begin = Date.now();
console.log("begin time:" + time_begin);
arr_a = ['a', 'b', 'a', 'b', 'a', 'b']

async function iterTrans(arr_a) {
  var txs_arr_tmp = [];
  for (let aInfo of arr_a) {
    const fs = require('fs').promises;
    if (aInfo == "a") {
      try {
        await fs.readFile("./debug.json")
        txs_arr_tmp.push("a");
      } catch (error) {
        console.log(error)
        var obj_addr = {
          "success": false,
          "error_no": 1,
          "error_info": "err with addrs"
        }
        return res_send.jsonp(obj_addr);
      }
    } else {
      txs_arr_tmp.push("b");
    }
  }
  return txs_arr_tmp;
}

iterTrans(arr_a).then((txs_arr_tmp) => {
  var content_str = JSON.stringify(txs_arr_tmp);
  console.log(content_str);
}) 

Если fs 'обещал методы недоступны

var time_begin = Date.now();
console.log("begin time:" + time_begin);
arr_a = ['a', 'b', 'a', 'b', 'a', 'b']

async function iterTrans(arr_a) {
  var txs_arr_tmp = [];
  for (let aInfo of arr_a) {
    let util = require('util');
    const readFile = util.promisify(require('fs').readFile);
    if (aInfo == "a") {
      try {
        await readFile("./debug.json")
        txs_arr_tmp.push("a");
      } catch (error) {
        console.log(error)
        var obj_addr = {
          "success": false,
          "error_no": 1,
          "error_info": "err with addrs"
        }
        // return res_send.jsonp(obj_addr);
      }
    } else {
      txs_arr_tmp.push("b");
    }
  }
  return txs_arr_tmp;
}

iterTrans(arr_a).then((txs_arr_tmp) => {
  var content_str = JSON.stringify(txs_arr_tmp);
  console.log(content_str);
})
...