getURL确实返回一个promise对象,为什么不起作用?
const fs = require('fs');
function getURL(URL){
fs.readFile(URL,(err, buffer)=>{
if(err) return Promise.reject(err.message);
return Promise.resolve(buffer.toString());
});
// return Promise.resolve(42); works
}
getURL('1.txt').then(text=>{
console.log(text);
}).catch(err=>{
console.log(err);
});
感谢。我可以使用静态方法Promise.resolve而不是返回新的Promise对象吗?
答案 0 :(得分:1)
你不能return a value from an asynchronous callback。
相反,您需要在外部函数中创建promise(使用new Promise
),并在该promise的执行者中运行异步代码:
function getURL(URL) {
return new Promise((resolve, reject) => {
// run asynchronous code here
// call resolve on success or reject on error
fs.readFile(URL, (err, buffer) => {
if(err)
reject(err);
else
resolve(buffer.toString());
});
}
}
话虽这么说,但最好不要随时尽量避免创建承诺(如aaaaaa指出的那样,它是promise antipattern)。在fs
(以及其他内置节点模块)的特定情况下,我建议您使用类似mz
的内容,它包装所有内置模块并使其使用promises代替回调:
const fs = require('mz/fs');
function getURL(URL) {
return fs.readFile(URL)
.then((buffer) => buffer.toString());
}
// or even better:
function getURL(URL) {
return fs.readFile(URL, 'utf8');
}