getURL不会返回promise对象

时间:2017-05-02 03:29:18

标签: javascript

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对象吗?

1 个答案:

答案 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');
}