2016-08-05 20 views
0

関数の呼び出し元(サービスのユーザー)は、関数が生成する情報で何かをしたい場合に使用することができます。彼はそれが終わったときに気にしなければ、いつかやり遂げられる限り、インフラストラクチャーなしで機能を呼び出すことができます。関数は約束を返すことができますか?

これは機能しますか?私はテストでうまくいく状況にはなりたくないが、あまり頻繁に起こらないような不明確な状況では、失敗するだろう。


Hmm。私はこれが何を意味するかと思います。私は約束を返すルーチンを書いていた場合、私が言っている:

return new Promise(function (resolve, reject) { ... }); 

を私の呼び出し側は言っていない場合は、次の

.then(function() { ... }, function() { ... }); 

何が起こるのだろうか?私はある時点でresolve()またはreject()を呼び出し、解決と拒否は定義されません。 Promiseコンストラクタはデフォルトの(何もしない)定義を提供していますか?

私は私が狂った人だ場合、私は私の呼び出し先関数の中で言うことができると仮定します

(resolve || function() {})(); 
+0

私はフォローしていません。関数から必要なものを返すことはできますが、非同期操作が必要な場合は、常に約束を返す必要があります。関数の戻り値を使用する必要があるかどうかを確認するには、答えは「いいえ」です。しかし、操作が完了したという保証はありません。 –

+0

?呼び出し元は、戻り値で何かを行うかどうかを常に決めることができます。しかし、被告人はそれを知らない。 –

+0

私は、約束を返す非同期関数を実行し、解決にコードを追加することなくその作業を行うことができるかどうかという問題があると思います。答えは「はい」です。ただし、完了したことが確実でない限り、非同期機能が動作することを確実にテストすることはできません。 – danh

答えて

1

あなたはそれが何をしたいのですがどのような約束がどうなる返す関数。 。ユーザーは、チェーンB()()しない場合、それが行われるたびに、彼らは最終的に答えを得るでしょう

は、関数B()を考えます。値が入力された時期を知らないという事実を処理するのは、彼らの責任です。それが期待される。

ユーザーがチェーンB()、then()を実行した場合、値が返された後に何が起こるかを制御するための素敵で簡単な方法があります。

奇妙なエッジのケースについて心配する必要はありません。約束を返す関数は、明確かつ直接的な契約です。

1

Javascriptのすべての関数と同様に、呼び出し元は戻り値を自由に無視できます。 Javascriptガベージコレクタは、もはや使用されていないオブジェクトまたは値を処理します。

したがって、約束を返す非同期操作の呼び出し元が実際に処理しても問題がない場合、またはエラーがある場合は、呼び出し元は返された約束を無視するだけです。何も悪いことは起こりません(あなたにエラーがあることを知らないかもしれないという事実以外)。

あなたが言うところこれにクールではないようですあなたの質問の一部です:を「それが行われますとき、彼がいる限り、それがいつか行われますよう、気にしない場合は」。非同期エラーを無視している場合は、実際には実行されないことがあります。この場合、何をする方が適切かもしれません:

someAsyncFunc(...).catch(function(err) { 
    console.err(err); 
    // so something meaningful with the error here 
}); 
-1

あなたは、特にアンチパターンをPromiseコンストラクタを使用している、レガシーAPIをラップする必要がない限り。代わりにPromiseファクトリーを使用するか、bluebirdを使用する場合は、レガシー機能でbluebirdのpromisifyを使用できるかどうかを確認してください。

また、Promiseコンストラクタ関数の引数のパラメータが何であるか誤解しているようです。彼らはコールバックではなく、Promiseを解決する関数です。 Promise自体は、存在する場合、コールバックに通知することについて心配するでしょう。

また、関数がPromiseを返すことがあり、時にはそうでない場合、関数の戻り値に.thenを呼び出すことができると想定するコードがクラッシュする可能性があります。それをしないでください。

計算が非同期の場合は、常にPromiseを返します。すでに決済されている値を返却する場合は、Promise.resolve(theValue)を返します。

+0

コンストラクタではなく、ファクトリを使用します。よく取られるポイント。私はそれを調べます。 (私はブルーバードを使用していません)/あなたの文章を見て "あなたの関数が時々約束を返すかどうか、時にはそうではないか"。私の関数は常に約束を返します。呼び出し元は、要求された作業の完了時に同期するものがなければ、それが約束を返すという事実を心配する必要はありません。 – user2171796

+0

呼び出し元はこれらの両方のことを言うことができ、両方とも動作します:1. myPromiseReturningFunction(); console.log( 'mPRFを起動した後'); 2. myPromiseReturningFunction()。then(function(){console.log( 'mPRFを完了した後');}); console.log( 'mPRFを起動した後'); – user2171796

関連する問題