栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在循环中与fs.readFile一起使用Promises

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在循环中与fs.readFile一起使用Promises

因此,只要您有多个异步操作以某种方式进行协调,我都会立即承诺。并且,使用promise协调许多异步操作的最佳方法是使每个异步操作返回一个promise。您显示的最低级别的异步操作是

fs.readFile()
。由于我使用了Bluebird
Promise库,因此它具有用于“保证”整个模块有价值的异步功能的功能。

var Promise = require('bluebird');var fs = Promise.promisifyAll(require('fs'));

这将在

fs
带有“异步”后缀的对象上创建新的并行方法,该后缀返回承诺而不是使用直接回调。因此,将有一个
fs.readFileAsync()
返回承诺的机会。您可以在此处阅读有关Bluebird传播的更多信息。

因此,现在您可以创建一个函数,该函数可以非常简单地获取图像并返回一个promise,其值是图像中的数据:

 function getImage(index) {     var imgPath = __dirname + "/image1" + index + ".png";     return fs.readFileAsync(imgPath); }

然后,在您的代码中,您似乎想

bFunc()
成为一个函数,可以读取其中的三个图像并
cFunc()
在完成后调用。您可以这样做:

var Promise = require('bluebird');var fs = Promise.promisifyAll(require('fs')); function getImage(index) {     var imgPath = __dirname + "/image1" + index + ".png";     return fs.readFileAsync(imgPath); } function getAllImages() {    var promises = [];    // load all images in parallel    for (var i = 0; i <= 2; i++) {        promises.push(getImage(i));    }    // return promise that is resolved when all images are done loading    return Promise.all(promises); } getAllImages().then(function(imageArray) {    // you have an array of image data in imageArray }, function(err) {    // an error occurred });

如果您不想使用Bluebird,则可以手动创建一个Promise版本,

fs.readFile()
如下所示:

// make promise version of fs.readFile()fs.readFileAsync = function(filename) {    return new Promise(function(resolve, reject) {        fs.readFile(filename, function(err, data){ if (err)      reject(err);  else      resolve(data);        });    });};

或者,在现代版本的node.js中,您可以

util.promisify()
用来制作遵循node.js异步调用约定的函数的承诺版本:

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

不过,您会很快发现,一旦开始使用Promise,您就想将其用于所有异步操作,这样您就可以“许诺”很多事情,并拥有一个可以满足您需求的库或至少一个泛型函数节省大量时间。


在更高版本的node.js(版本10.0+)中,您可以使用

fs
支持promise 的库的内置版本:

const fsp = require('fs').promises;fsp.readFile("someFile").then(data => {    console.log(data);});


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436523.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号