2016-09-12 10 views
0

私はノード4.5+とブルーバードを使用しています。私はthenで使用する次のコードを持っている:ブルーバードの約束は未定義ですか?

var checkdir = function(directory) { 
    return new Promise(function(resolve, reject) { 
     fs.statAsync(directory).then(function() { 
      resolve(true); 
     }).catch(function(err) { 
      if(err.code === 'ENOENT') { 
       fs.mkdirAsync(directory).then(function() { 
        resolve(true); 
       }).catch(function() { 
        reject(new Error('Can not create folder')); 
       }); 
      } else { 
       reject(new Error('Unknown fs stat error: ' + err)); 
      } 
     }); 
    }); 
}; 

Async機能がfs-extra-promiseモジュールからです。しかし、この関数を使用しようとすると、私はUnhandled rejection Error: Unknown error: TypeError: Cannot read property 'then' of undefinedを取得します。

呼び出す:

   checkdir(dir).then(function() { 
        ... 
       }).catch(function(err) { 
        reject(new Error('Unknown error: ' + err)); 
       }); 

はここに何が間違っているのですか?

+0

これは変ですが、あなたのコードはブルーバードなしのスニペットで検索されます。あなたはどのようにライブラリを実装していますか? – Randy

+0

を参照してください。http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

+0

どのような指示(スタックトレース)の '。その後、エラーは参照していますか? –

答えて

3

ファイルシステムの操作で「種類の」チェックを使用すると、ノードのマニュアルに「actively discouraged」と表示されます。 (あなたが行うかどうかstatまたはexistsは無関係であると確認し存在しています。)

あなたのコードで the improper use of promises in generalに関するベンジャミンGruenbaumさんのコメントに加えて、意味

は、作るためにもう一つの重要なポイントがあります:

正しい方法無制限にmkdirを呼び出し、EEXISTを無視することにより、ディレクトリを作成します(詳細はthis answerを参照)。

var fs = Promise.promisifyAll(fs); 

var ensureDir = function ensureDir(path) { 
    return fs.mkdirAsync(path).catch((err) => { if (err.code !== 'EEXIST') throw err; }); 
} 

あなたはmkdir -pのように、再帰的にパスを作成するでしょうthe mkdirp moduleを使用することができます。

+0

私はコードを変更しましたが、まだエラーが発生しています: '未処理の拒否エラー:不明なエラー:タイプエラー:プロパティを読み取ることができません '、次に'未定義です '。別の約束の拒否になることはできますか? – user37741

+0

私のコードには '.then()'はありませんので、エラーはエラーとは何の関係もありません。 – Tomalak

+1

私はチェーン全体の返品結果を台無しにすることを約束しました。ありがとうございました! – user37741

関連する問題