2017-06-02 70 views
-1

沒有得到如何得到執行下面的代碼返回內容...不能從承諾

// readFile.js 

const fs = require('fs'); 
var readFile = function readFile(fileName){ 
    return new Promise((resolve, reject)=>{ 
    fs.readFile(fileName, {encoding: 'utf-8'}, (err, contents)=>{ 
     if(err){ 
     reject(err); 
     } 
     resolve(contents); 
    }); 
    }); 
}; 
module.exports.readFile = readFile; 

//play.js 
const {readFile} = require('./readFile'); 

var getText = function getTextFromFile(){ 

    readFile('readMe.txt').then((contents)=>{ 
    return contents; 
    }).catch((err)=>{ 
    console.log(err); 
    }); 
}; 
module.exports.getText = getText; 

//someFile.js 
const {getText} = require('./play.js'); 

var result = getText(); 
console.log(result); 

當我執行someFile.js,它打印不確定的。它應該打印內容,因爲play.js文件中的then塊將僅在異步任務即從文件讀取內容結束時執行。使用上面的代碼,如何將內容返回到其他文件,例如從play.js到someFile.js?

+1

你正試圖從同步返回一個值一個承諾。這不可能。只需從'getText'返回Promise,然後在'someFile.js'中使用'.then()'。 – cubrr

+0

是啊,修好了@cubrr謝謝 –

回答

-1

承諾是異步的,你應該爲這個函數提供的回調,像這樣:

function getTextFromFile(cb){ 

    readFile('readMe.txt').then((contents)=>{ 
    cb(null, contents); 
    }).catch((err)=>{ 
    console.log(err); 
    cb(err); 
    }); 
}; 

,你可以得到你的文件是這樣的:

const { getText } = require('./play.js'); 

getText((err, data) => { 
    if(err) throw new Error('file doesnt exist'); 
    console.log(data); 
}); 

你可以在這裏使用的承諾很好,但底線是:

您的代碼中的某些內容是異步的,您不能使用return

甚至更​​好,從這裏取出中間人,因爲不需要它:

const {readFile} = require('./readFile.js'); 

readFile('example.json') 
    .then((data) => console.log(data)) 
    .catch((err) => console.log(err)); 

當然,你可以使用fs.readFileSync,但它是一個bad practice