ファイルからjson配列オブジェクトを処理するのにPromise bluebirdを使用しています。問題は、json配列(リストと呼ばれる)にデータを格納し、最終プロセスでこれを返す場合に発生します。 リストが返された後、または最終プロセスでさえ、リストは空白/未定義です。コードを実行すると、私は常にリストのjsonの追加/プッシュを引き起こすfalseでない1つの値を持っています。JSON配列が未定義で空白が約束Bluebird
この問題を解決できますか?下に私のコードがあります。
ありがとうございます!!!サミュエルの助けを借りて
var Promise = require('bluebird');
var join = Promise.join;
var fs = Promise.promisifyAll(require("fs"));
fs.readdirAsync(dir).map(function (filename) {
return fs.readFileAsync(dir + "/" + filename, "utf8");
}).then(function(result){
var list=[];
result.map(function(row, index){
Promise.coroutine(function*() {
update(row, index).then(function(value){
if (value!=false){
var trade_update = new updated_Item(row.ID, row.Quantity, row.Price, row.Remark);
list.push(trade_update);
console.log(JSON.stringify(list)); <-- This works. It gives me data
}
return list;
})
})();
});
console.log('list: ' + JSON.stringify(list)); <-- output: list:[]
return list;
}).finally(function(result){
console.log('Final outcome: '+ ' ' + JSON.stringify(result)); <-- output: Final outcome: undefined
})
私のコードは以下のようになります。
var Promise = require('bluebird');
var join = Promise.join;
var fs = Promise.promisifyAll(require("fs"));
function updateOrder(done){
fs.readdirAsync(dir).map(function (filename) {
return fs.readFileAsync(dir + "/" + filename, "utf8");
}).then(function(result){
var list=[];
result.map(function(row, index){
Promise.coroutine(function*() {
update(row, index).then(function(value){
if (value!=false){
var trade_update = new updated_Item(row.ID, row.Quantity, row.Price, row.Remark);
list.push(trade_update);
done(list);
}
})
})();
});
//done(list); <--if I put the done callback here, it will give me an empty list. I though once the result.map finished processing all the values give me the end result.
}
}
updateOrder(function(resultList){
console.log('List' + JSON.stringify(resultList));
})
このコードは私に今毎回リストが更新(プッシュ)された全体resultListを与えます。
updateOrder関数が終了すると、最後にresultListを受け取ります。
'Promise.coroutine'は非同期なので、' list'は後になるまでの任意の値を取得することはありません。 –