2017-01-30 9 views
0

私は次のコードのような.thenメソッドの内部での約束の値にアクセスすることができます知っている:上記の例で関数からPromiseの値を返すにはどうすればよいですか?

const Promise = require("bluebird"); 
const fs = Promise.promisifyAll(require('fs')); 
const mergeValues = require('./helper').mergeValues; 


fs.readFileAsync('./index.html', {encoding: "utf8"}) 
    .then((data) => { 
     return mergeValues(values, data); //async function that returns a promise 
    }) 
    .then((data) => { 
     console.log(data); 
    }); 

、私は、ファイルからの読み込みいくつかの値を使用してデータをマージした後、ログインしていますデータをコンソールに送信します。

しかし、通常は同期関数のように、関数から値を返すのはどうですか?私はthis comment on synchronous inspectionに従っている場合、私はコードは次のようになりますと思う:

function getView(template, values) { 
    let file = fs.readFileAsync('./' + template, {encoding: "utf8"}); 
    let modifiedFile = file.then((data) => { 
      return mergeValues(values, data); 
     }); 
    return modifiedFile.then((data) => { 
     return modifiedFile.value(); 
    }); 
} 
console.log(getView('index.html', null)); 

しかし、いくつかの理由で、それは働いていません。私がコンソールに入っているのは、値ではなくPromiseオブジェクトだけです。そして、.isFulfilledメソッドをmodifiedFileに追加すると、trueに出力されます。だから私は間違って何をやっているのか分かりません。

+0

asyncから値を返すことは決してできません。これまで標準的な答え:[非同期呼び出しから応答を返すにはどうすればいいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Amadan

+0

非同期呼び出しにコミットすると、その操作の結果に依存するすべてのものは、定義上asyncも同様です。つまり、あなたの関数でPromiseを使用していて、それから何かを得る必要がある場合は、約束を返します。待つことはできません。 – tadman

答えて

1

約束はそのようには機能しません。それらは本来、の非同期です。したがって、同期コードと同じ方法で対話することはできません。にあなたが持っている意味

は価値で取得するためにthenメソッドを使用します。

function getView(template, values) { 
    let file = fs.readFileAsync('./' + template, {encoding: "utf8"}); 
    let modifiedFile = file.then((data) => { 
      return mergeValues(values, data); 
     }); 
    return modifiedFile.then((data) => { 
     return modifiedFile.value(); 
    }); 
} 
// This won't work 
// console.log(getView('index.html', null)); 

// instead: 
getView('index.html', null).then(function (view) { 
    console.log(view); 
}); 

だから私は、私が間違ってやっているかわからないんだけど。

あなたは実際に何かを間違って実行していません。あなたは関数からの通常の戻り値のような約束を使うことはできません。期間。

+0

説明をありがとう! –

関連する問題