关于promise的回调取参问题。
发布于 5 年前 作者 BubblyFace 3426 次浏览 来自 问答

自己仿照promise的标准造轮子。封装一个read文件的方法。想让其返回一个promise。但是通过回调拿到的数据不知道如何暴露给外部比较好。

function readFile_t(url, encoding,getter) {
    var promise;
    var getter = getter;
    require('fs').readFile(url, encoding,
        (err, data) => {
            this.promise = new Promise((resolve, reject) => {
                resolve(data)
            })
            this.getter = this.promise;
        });
}
var file1,file2;
//这里外部的file1,file2是拿不到promise对象的
readFile_t("sysConfig.js", "utf-8", file1)
readFile_t("utf8.js", "utf-8",file2)
deffered2.all(file1, file2).then((result) => {
    console.dir(result)
})

我已经发现我的写法是拿不到promise的了,如果我想通过回调拿到promise对象,应该如何实现呢?求大神解答!!

13 回复
function readFile_t (url, encoding) {
	return new Promise( (resolve, reject) => {
		require('fs').readFile(url, encoding, (err, data) => {
			if (err) {
				return reject(err)
			}
			return resolve(data)
		})
	})
}

@Asher-Tan 脑回路怎么就想到用回调返回promise了呢,太感谢您了

getter应该传入一个函数callback,然后在里面callback(getter)

@dislido 之前是这么写的

function readFile_t(url, encoding,cb) {
    var promise;
    require('fs').readFile(url, encoding,
        (err, data) => {
            this.promise = new Promise((resolve, reject) => {
                resolve(data)
            })
			cb(this.promise)
        });
}

可是我的目的还是直接拿到promise对象,这样去做最后还是得从回调去取。最终外部直接拿还是没拿到。。。

@BubblyFace

async function readFile_t(url, encoding) {
  return require('fs').readFileSync(url, encoding);
}

node8还有一个更粗暴的

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

return new Promise

读取文件的话为什么不用fs extra?

@dislido … async 里面用 readFileSync …

你的代码是因为在里面没有 return promise

可以看下这块的社区优秀类库 https://www.npmjs.com/package/mz 的源码

const fs = require('mz/fs');
await fs.readFile('path/to/your/file');

image.png

@2linziyi2 写文件只是为了写一个实现,我只是尝试在做一个promise的流程

@dislido 我前两天也是看到node8的,越来越粗暴

@atian25 是的,思路断片了,没得想到把promise放到外层去返回

@atian25 嗯嗯,谢谢了

回到顶部