首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在循环中使用Promises和fs.readFile

在循环中使用Promises和fs.readFile
EN

Stack Overflow用户
提问于 2016-01-06 16:06:19
回答 3查看 105.7K关注 0票数 40

我在试着理解为什么下面的promise设置不起作用。

(注意:我已经用async.map解决了这个问题。但我想知道为什么我在下面的尝试没有奏效。)

正确的行为应该是: bFunc应该运行尽可能多的时间来文件系统读取所有图像文件(下面的bFunc运行两次),然后cFunc控制台打印"End“。

谢谢!

尝试1:它在cFunc()处运行并停止。

代码语言:javascript
运行
复制
var fs = require('fs');

bFunc(0)
.then(function(){ cFunc() }) //cFunc() doesn't run

function bFunc(i){
    return new Promise(function(resolve,reject){

        var imgPath = __dirname + "/image1" + i + ".png";

        fs.readFile(imgPath, function(err, imagebuffer){

            if (err) throw err;
            console.log(i)

            if (i<1) {
                i++;
                return bFunc(i);
            } else {
                resolve();
            };

        });

    })
}

function cFunc(){
    console.log("End");
}

尝试2:在本例中,我使用了一个for循环,但它的执行顺序是错误的。控制台打印: End、bFunc done、bFunc done

代码语言:javascript
运行
复制
var fs = require('fs');

bFunc()
        .then(function(){ cFunc() })

function bFunc(){
    return new Promise(function(resolve,reject){

        function read(filepath) {
            fs.readFile(filepath, function(err, imagebuffer){
                if (err) throw err;
                console.log("bFunc done")
            });
        }

        for (var i=0; i<2; i++){
            var imgPath = __dirname + "/image1" + i + ".png";
            read(imgPath);
        };

        resolve()
    });
}


function cFunc(){
    console.log("End");
}

提前感谢您的帮助!

EN

回答 3

Stack Overflow用户

发布于 2018-08-28 22:52:47

Node v10有fs Promises API

代码语言:javascript
运行
复制
const fsPromises = require('fs').promises

const func = async filenames => {

  for(let fn of filenames) {
    let data = await fsPromises.readFile(fn)
  }

}

func(['file1','file2'])
  .then(res => console.log('all read', res))
  .catch(console.log)

https://nodejs.org/api/fs.html#fs_fs_promises_api

或者,如果您想同时读取更多文件:

代码语言:javascript
运行
复制
const func = filenames => {
  return Promise.all(
    filenames.map(f => fsPromises.readFile(f))
  )
}

func(['./a','./b'])
  .then(res => console.log('all read', res))
  .catch(console.log)
票数 58
EN

Stack Overflow用户

发布于 2021-12-22 23:56:52

如果您使用的是.mjs ECMAScript模块import语法,那么下面是基于this GitHub gist comment reply读取文件的代码

代码语言:javascript
运行
复制
import { promises as fs } from 'fs';
let json = await fs.readFile('./package.json', 'utf-8');
console.log(json);

下面是基于this answer执行多个文件的代码

代码语言:javascript
运行
复制
import { promises as fs } from 'fs';

const sequentially = async filenames => {
    for(let fn of filenames) {
        let json = await fs.readFile(fn, 'utf-8');
        console.log(json);
    }
}

const parallel = filenames => {
    return Promise.all(
      filenames.map(fn => fs.readFile(fn, 'utf-8'))
    )
  }

const fns = ['package.json', 'package-lock.json'];
await sequentially(fns);
await parallel(fns);
console.log('all read');
票数 1
EN

Stack Overflow用户

发布于 2019-03-05 12:55:25

您还可以使用此模块:'fs-readfile-promise‘

代码语言:javascript
运行
复制
var readFile = require('fs-readfile-promise');
readFile(__dirname + '/file1.txt','utf-8').then(function (data){
    console.log("file's name:", data)
    return readFile(__dirname +'/'+data, 'utf-8')
}).then(function (data1){
    console.log('Content data:', data1)
}).catch( function (err){
    console.log(err)
})

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34628305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档