在JavaScript/Node.js中,如何使用Async/Await

在JavaScript/Node.js中,如何使用Async/Await,javascript,node.js,async-await,Javascript,Node.js,Async Await,在JavaScript/Node.js中,如何使用Async/Await让下面的代码返回带有a、b、c和d的placeName test.csv有c,d var placeName = ["a","b"]; var csvFile = 'test.csv'; fs.readFile(csvFile, 'UTF-8', function(err, csv) { $.csv.toArrays(csv, {}, function(err, data) { for(var i=0, len=

在JavaScript/Node.js中,如何使用Async/Await让下面的代码返回带有a、b、c和d的placeName

test.csv有c,d

var placeName = ["a","b"];
var csvFile = 'test.csv';
fs.readFile(csvFile, 'UTF-8', function(err, csv) {
  $.csv.toArrays(csv, {}, function(err, data) {
    for(var i=0, len=data.length; i<len; i++) {
      console.log(data[i]); //Will print every csv line as a newline
      placeName.push(data[i][0].toString());
    }
  });
   console.log(placeName); //Inside the function the array show a,b,c,d
});

// Prints only a and b. Did not add c & d from the csv.
console.log(placeName); 
var placeName=[“a”,“b”];
var csvFile='test.csv';
fs.readFile(csvFile,'UTF-8',函数(err,csv){
$.csv.toArray(csv,{},函数(err,data){
对于(var i=0,len=data.length;i创建一个返回承诺的函数
await
运算符等待承诺的实现,并且只能在调用时返回承诺的
async
函数中使用。因此,更新地名需要编写为返回承诺的函数。可以对所有操作使用单个承诺,但不建议:

function addNames(placeName, csvFile) {
    return new Promise( (resolve, reject) => {
        fs.readFile(csvFile, 'UTF-8', function(err, csv) {
            if(err) {
               reject(err);
            }
            else {
                $.csv.toArrays(csv, {}, function(err, data) {
                    if( err) {
                        reject( err);
                    }
                    else {
                        for(var i=0, len=data.length; i<len; i++) {
                            console.log(data[i]); //print supplied data elements
                            placeName.push(data[i][0].toString());
                        }
                    }
                    resolve( placeName);
                });

            }
        });
    });
}
作为承诺链的一部分呼叫 在不使用async/await的情况下使用时,需要添加承诺处理程序,以便在数据可用或发生错误后异步调用履行和拒绝:

var placeName = ["a","b"];
var csvFile = 'test.csv';

addNames( placeName, csvFile)
.then( placeName => console.log(placeName)) // log updated places
.catch( err => console.log( err));  // or log the error.
使用
wait
如前所述,
await
运算符只能在异步函数中使用。它等待实现的承诺数据,以便在同一函数中进一步处理

async function example() {

    var placeName = ["a","b"];
    var csvFile = 'test.csv';

    await addNames( placeName, csvFile);
    // do something with placeName

    return somethingElse;       
}
尚未显示将履行和拒绝处理程序添加到通过调用
示例
返回的承诺中

关于
返回等待
。。。 请注意,从异步函数返回的承诺会解析通过调用该函数返回的承诺

 return await operand
包含不必要的
wait
运算符

编写异步函数而不是普通函数(TLDR) 在节点中使用
async
函数仍然需要将使用错误/成功回调的操作转换为返回承诺的请求(“承诺”操作),但在语法上允许编写代码,以处理在
wait
操作后立即编写的请求。生成的代码在样式上与过程代码类似。例如:

function readCsvFile( csvFile) {
    return new Promise( (resolve, reject)  => {
        fs.readFile(csvFile, 'UTF-8',
           (err, csv) => err ? reject(err) : resolve( csv)
        );
    });
}
function decodeCsv( csv) {
    return new Promise( (resolve, reject) => {
        $.csv.toArrays(csv, {},
           (err, data) => err ? reject( err) : resolve( data)
        );
    });
}

async function addNames( placeName, csvFile) {
    let csv = await readCsvFile( csvFile);
    let arrays = await decodeCsv( csv);
    let names = arrays.map( item => item[0].toString());
    placeName.push.apply( placeName, names);
    return placeName;
}

欢迎来到stack overflow。当您在这里发表文章时,我们希望您首先对问题做了一些基础研究,然后在接受有关概念的教育后在这里发表文章,但在实现中遇到了一些具体问题。我们不是一家只为您从头开始编写代码的编码服务机构。这里有数百个常规教程在web上介绍如何使用async/await。您的代码根本不知道这些教程中的任何一个。请先阅读,然后尝试使用您所阅读的实现,并在遇到问题时发回。我将给您一个开始的提示。
await
仅适用于返回承诺的函数,因此首先必须进行任何异步您使用的ronous操作通过承诺而不是简单的回调来工作,然后您可以在返回承诺的函数上使用
await
。您必须首先了解承诺是什么,因为新的
async/await
语法实际上是语法上的糖衣。从理解同步代码和异步代码开始。调用
fs.readFile
在记录“placeName”时从事件循环中发出的同一调用中是同步代码的一个示例。在不等待读取操作的异步回调发生的情况下,您只会看到它初始化为的
placeName
的值。更新将在一段时间后异步进行。请单独设置promi用于
fs.readFile
$.csv.ToArray
的ses。不要将业务逻辑放在非承诺回调中。@Bergi感谢您提供的非常有用的反馈。非常感谢!
function readCsvFile( csvFile) {
    return new Promise( (resolve, reject)  => {
        fs.readFile(csvFile, 'UTF-8',
           (err, csv) => err ? reject(err) : resolve( csv)
        );
    });
}
function decodeCsv( csv) {
    return new Promise( (resolve, reject) => {
        $.csv.toArrays(csv, {},
           (err, data) => err ? reject( err) : resolve( data)
        );
    });
}

async function addNames( placeName, csvFile) {
    let csv = await readCsvFile( csvFile);
    let arrays = await decodeCsv( csv);
    let names = arrays.map( item => item[0].toString());
    placeName.push.apply( placeName, names);
    return placeName;
}