我在试着理解为什么下面的promise设置不起作用。
(注意:我已经用async.map解决了这个问题。但我想知道为什么我在下面的尝试没有奏效。)
正确的行为应该是: bFunc应该运行尽可能多的时间来文件系统读取所有图像文件(下面的bFunc运行两次),然后cFunc控制台打印"End“。
谢谢!
尝试1:它在cFunc()处运行并停止。
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
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");
}
提前感谢您的帮助!
发布于 2018-08-28 22:52:47
Node v10有fs Promises API
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
或者,如果您想同时读取更多文件:
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)
发布于 2021-12-22 23:56:52
如果您使用的是.mjs
ECMAScript模块import
语法,那么下面是基于this GitHub gist comment reply读取文件的代码
import { promises as fs } from 'fs';
let json = await fs.readFile('./package.json', 'utf-8');
console.log(json);
下面是基于this answer执行多个文件的代码
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');
发布于 2019-03-05 12:55:25
您还可以使用此模块:'fs-readfile-promise‘
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)
})
https://stackoverflow.com/questions/34628305
复制相似问题