2017-01-22 17 views
-3

私は約束をノードに使用しようとしています。約束を使用することができません

しかし、then部分は実行されていません。 最初の関数はresolve()インスタンスを返します。 これを修正するにはどうすればよいですか?

これはコードです:

exports.refresh_access_token = function (environment_hash) { 

    ... 

    Model.update(values, {where: where}).then(function() { 
     console.log('updated!'); 
     resolve("Success!"); 

    }).catch(function (err) { 
     console.log('error on update'); 
    }); 

    ... 

} 

async.map(accounts, function (account) { 
    module.exports.refresh_access_token(account.environment_hash).then(function() { 
     console.log('async called back'); 
    }); 
} 
+0

'最初の関数は(決意を返しますか? –

+0

それは単なる解決( '成功')です。 –

+0

しかし、 '解決'とは何ですか?特別な意味を持たず、あなたのコードに定義されていません –

答えて

1

を使用することができるようにあなたの約束を返却する必要があります修正できるいくつかのエラーがあります:

  1. 内部の約束が完了したら、その約束を返さなければなりません。 .then()ハンドラ内から呼び出すしようとしているにはポイントがありませんので、だから、returnreturnにModel.update(...) `

  2. resolve()を追加することは世界的に利用できる機能ではありません。実際には、resolveが定義されていないため、例外がスローされる可能性があります。

  3. .then()ハンドラの中にいる場合、元の約束はすでに解決されています。何かを解決する必要はありません。親の約束の解決された値として値を返すには、その値を返します。

  4. .catch()ハンドラ内からログオンすると、ホストの約束を拒否したままにしておきたい場合は、エラーを再スローする必要があります。それ以外の場合、エラーは「処理され」、約束は解決済みに変わります。

  5. 次に、2番目のコードブロックでは、asyncライブラリと約束を組み合わせるのは実際には意味がありません。これらは、非同期操作を管理するための異なるアプローチです。 1つのスキームを選択するか、他のスキームを選択します。あなたのような約束が既にある場合は、その約束を返すだけで、発信者に約束を使用させることができます。すでに約束がある場合はasyncライブラリの必要はありません。

あなたはこのようなものを修正することができます解決のインスタンスが何であるかをinstance`)

exports.refresh_access_token = function (environment_hash) { 

    ... 

    return Model.update(values, {where: where}).then(function() { 
     console.log('updated!'); 
     return "Success!"; 

    }).catch(function (err) { 
     console.log('error on update'); 
     // after logging, make sure promise stays rejected 
     throw err; 
    }); 

    ... 

} 
+0

助けてくれてありがとうございます。私はparellel(refresh_access_token関数)内のデータベースのすべての要素に対して特定のプロセスを実行し、refresh_access_tokenが完了したときにのみ別のプロセスを実行したい –

+1

@FilipeFerminiano - この多くのコードで、どこが間違っているのかを細かく詳しく説明していないとき(たとえば、あなたがすでに行ったデバッグとトラブルシューティングを説明するなど)。あなたは、あなたの質問のコードとはまったく関係のない、たくさんのものを説明しました。私たちは、あなたが提示したコードとあなたが提供した説明で最善を尽くしています。ヘック、私はすでに多くのコードで修正する4つのことをあなたに与えました。私たちが何を続けなければならないのか、ここでは何もできません。 – jfriend00

+0

回答ありがとうございます。私はあなたが私の問題を解決するのを手伝っています。しかし、私はこれを行う約束についてはあまり知りません。私は、コードが期待どおりに機能していないことを知っています。私はそれについてもっと学び、私が正しい道にいるかどうかを調べるつもりです。私はあなたの助けに感謝の信号としてあなたの答えを受け入れています。 –

0

あなたはそれはあなたが求めているものを100%明確ではないのですが、そこthen

return Model.update(...)

+0

リターンモデルを追加しましたが、何も起こりません。 –

+0

あなたが約束を使用するたびに、呼び出し元の関数がそれを待つことができるように返す必要があることを示すコードが表示されるため、表示されないコードに問題がある可能性があります。 – user3

+0

コードを編集しました。私はasync.map関数の中で関数を呼び出しています。parellel(refresh_access_token関数)のデータベースのすべての要素に対して特定のプロセスを実行してから、refresh_access_tokenが@ user3を終了したときにのみ別のプロセスを実行したいからです。 –

関連する問題