2017-03-22 46 views
1

我是node.js的新手,試圖繞着承諾努力工作。我正在嘗試從文件中讀取內容,返回承諾和文件內容。我到目前爲止能夠閱讀文件的內容並在控制檯上打印它們,並返回一個承諾。我想要返回文件的內容。退貨承諾和內容(可能很多)

這是我的代碼到目前爲止。

function() { 
return fs.exists(listFile).then(function (exists) { 
    if(exists) { 
     return fs.readFile(listFile).then(function(response) { 
      console.log(response.toString()); 
     }).catch(function(error) { 
      console.error('failed to read from the file', error); 
     }); 
    } 
}).catch(function(err) { 
    console.error('Error checking existence', err) 
}); 
}; 
+0

回答類似的問題:http://stackoverflow.com/a/39761387/4175944 – Christopher

+3

您使用的藍鳥? 'fs.exists()'不返回一個Promise。 – jessegavin

+0

[如何正確獲取從承諾返回的值?]可能重複(http://stackoverflow.com/questions/39761302/how-to-correctly-get-the-value-returned-from-a-promise) – Christopher

回答

1

fs.readFile(listFile)返回一個承諾。這就是爲什麼你可以鏈接它後面的「.then()」方法。目前沒有什麼可以回報的。此外,它將返回到您在第二行傳遞給「.then」的回調函數。

要訪問文件的內容,您需要調用另一個函數,並將文件內容直接打印到控制檯。

function() { 
return fs.exists(listFile).then(function (exists) { 
    if(exists) { 
     fs.readFile(listFile).then(function(response) { 
      console.log(response.toString()); 
      handleFileContents(response.toString()); 
     }).catch(function(error) { 
      console.error('failed to read from the file', error); 
     }); 
    } 
}).catch(function(err) { 
    console.error('Error checking existence', err) 
}); 
}; 

function handleFileContents(content) { 
    // ... handling here 
} 
+1

@baao,OP使用'mz/fs',它返回承諾。 – zzzzBov

+0

Ahhhhhhh @zzzzBov,謝謝澄清 – baao

+0

@Lenco這是如何解決我不得不返回內容和承諾的問題?我將需要將文件內容傳遞給另一個承諾。 –

0

你不能return文件本身的內容,它們是異步檢索。所有你能做的就是回到一個承諾內容:

function readExistingFile(listFile) { 
    return fs.exists(listFile).then(function (exists) { 
     if (exists) { 
      return fs.readFile(listFile).then(function(response) { 
       var contents = response.toString(); 
       console.log(contents); 
       return contents; 
//    ^^^^^^^^^^^^^^^^ 
      }).catch(function(error) { 
       console.error('failed to read from the file', error); 
       return ""; 
      }); 
     } else { 
      return ""; 
     } 
    }).catch(function(err) { 
     console.error('Error checking existence', err) 
     return ""; 
    }); 
} 

使用它像

readExistingFile("…").then(function(contentsOrEmpty) { 
    console.log(contentsOrEmpty); 
}); 

順便說一句,using fs.exists like you did is an antipattern,而且它一般不推薦使用。忽略它,只是捕獲錯誤從一個不存在的文件:

function readExistingFile(listFile) { 
    return fs.readFile(listFile).then(function(response) { 
     return response.toString(); 
    }, function(error) { 
     if (error.code == "ENOENT") { // did not exist 
      // … 
     } else { 
      console.error('failed to read from the file', error); 
     } 
     return ""; 
    }); 
}