CNode

关于promise的回调取参问题。

问答
BBubblyFace发布于9 年前最后回复9 年前13 回复5437 浏览0 收藏

自己仿照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)

A
Asher-Tan#1·9 年前
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)
		})
	})
}
B
BubblyFace#2·9 年前
引用 Asher-Tan``` javascript function readFile t (url, encoding) { return new Promise( (resolve, reject) = { r...

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

D
dislido#3·9 年前

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

B
BubblyFace#4·9 年前
引用 dislidogetter应该传入一个函数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对象,这样去做最后还是得从回调去取。最终外部直接拿还是没拿到。。。

D
dislido#5·9 年前
引用 BubblyFace@dislido 之前是这么写的 可是我的目的还是直接拿到promise对象,这样去做最后还是得从回调去取。最终外部直接拿还是没拿到。。。

@BubblyFace

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

node8还有一个更粗暴的

const readFile_t = require('util').promisify(require('fs').readFile);
C
CRAZYFAKE#6·9 年前

return new Promise

2
2linziyi2#7·9 年前

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

A
atian25#8·9 年前
引用 dislido@BubblyFace node8还有一个更粗暴的

@dislido ... async 里面用 readFileSync .....

A
atian25#9·9 年前

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

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

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

image.png

B
BubblyFace#10·9 年前
引用 2linziyi2读取文件的话为什么不用fs extra?

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

B
BubblyFace#11·9 年前
引用 dislido@BubblyFace node8还有一个更粗暴的

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

B
BubblyFace#13·9 年前
参与回复
登录后即可参与回复。登录