2017-05-02 66 views
0

getURL確實返回承諾對象,爲什麼不起作用?getURL不返回承諾對象

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

你'getURL()'函數不返回任何東西。 – Pointy

+0

從回調函數內部返回沒有用處。 –

+0

@NidhinDavid所以問題是異步操作? – wolfrevo

回答

1

您不能return a value from an asynchronous callback

相反,你需要創建外部函數的承諾(與new 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,它封裝所有的內置模塊,使它們使用的承諾,而不是回調的:

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