JSDocでpromiseの解決と拒否のタイプを指定するにはどうすればよいですか?


83

NodeJSにQライブラリを使用するなど、promiseオブジェクトを返すコードがいくつかあります。

var Q = require('q');

/**
 * @returns ???
 */
function task(err) {
    return err? Q.reject(new Error('Some error')) : Q.resolve('Some result');
}

JSDocを使用してそのような戻り値を文書化する方法は?


私は似たようなことを考えていました。アプリケーションの入力と状態に基づいて複数の異なるものを返すことができる関数の戻り値の型を文書化するにはどうすればよいですか?
ホフマン

ワイルドカード構文を使用します。@ returns {*}
Paul Sweatte 2012

ワイルドカード構文はそれほど具体的ではなく、役に立ちません。
アリコン2012

2
@arikon@returns {ErrorObject|ResultObject}助けになりますか?「パイプ」サインインタイプの説明を使用するのが一般的な方法です。
John Doe

3
@ john-doeいいえ、そうではありません。関数はPromiseオブジェクトを返すため、単なる結果やエラーではありません。
アリコン2013

回答:


72

Javascriptに存在しなくても、JSdocは「ジェネリック型」を理解していることがわかりました。

したがって、カスタムタイプを定義してから、を使用できます/* @return Promise<MyType> */。次の結果は、ドキュメント内のカスタムタイプへのリンクを含む素敵なTokenConsume(token)→{Promise。<Token>}になりますToken

/**
 * @typedef Token
 * @property {bool} valid True if the token is valid.
 * @property {string} id The user id bound to the token.
 */

/**
 * Consume a token
 * @param  {string} token [description]
 * @return {Promise<Token>} A promise to the token.
 */
TokenConsume = function (string) {
  // bla bla
}

/* @return Promise<MyType|Error> */またはで動作し/* @return Promise<MyType, Error> */ます。


1
@Sebastianはい、これがアイデアです!
jillro 2014年

YUIDocの場合、私はこれが機能することを発見しました:@return {Promise|Token}
J Chris A

良いアイデア!私はそれを次のように変更しました:@returns {Promise<ForumPost>|Promise<false>|Error}
Przemek Lewandowski 2017

1
jsdocはtypedefを、それを返す関数とは別のページに分離するため、このソリューションは非常に嫌いです。また、解決可能なすべてのオブジェクトタイプに名前を付ける必要がありますが、実際に実行したいのは、複数の値を返し、それらをオブジェクトにラップすることだけです。
Bob McElrath 2017

2
現在のソリューションとリリース予定のプロジェクト所有者からの更新github.com/jsdoc3/jsdoc/issues/1197#issuecomment-312948746–
Mike Grace

7

私はpromiseの外部型を定義する傾向があります:

/**
* A promise object provided by the q promise library.
* @external Promise
* @see {@link https://github.com/kriskowal/q/wiki/API-Reference}
*/

これ@returnで、関数ドキュメントのステートメントで、promiseがどうなるかを説明できます。

/**
* @return {external:Promise}  On success the promise will be resolved with 
* "some result".<br>
* On error the promise will be rejected with an {@link Error}.
*/
function task(err) {
    return err? Q.reject(new Error('Some error')) : Q.resolve('Some result');
}

6

JSDocでは、を使用してカスタムタイプを作成することもできます@typedef。私はこれをかなり使用しているので、文字列または配列であるprops / paramsは、型の説明にリンクstringします(たとえば、文字列で使用可能なネイティブを含むtypedefを作成しました(以下のJSDocの例を参照)。カスタム型を定義できます。これと同じ方法で、これは、@ propertyのようにオブジェクトのドット表記をリターンに使用して、リターンの内容を示すことができないためです。したがって、オブジェクトのようなものを返す場合は、定義を作成できます。そのタイプの場合( ' @typedef MyObject)、次に@returns {myObject} Definition of myObject

型はできるだけリテラルである必要があり、型を汚染したくないので、私はこれに夢中になることはありませんが、型を明示的に定義したい場合があるので、それが何であるかを文書化できますその中に(良い例はModernizrです...それはオブジェクトを返しますが、それのドキュメントがないので、その戻りの内容を詳述するカスタムtypedefを作成します)。

そのルートに行く必要がない場合は、すでに述べたように、パイプを使用して、@ param、@ property、または@returnに複数のタイプを指定できます|

あなたの場合、あなたは:@throwsを投げているので、も文書化する必要がありnew errorます* @throws {error} Throws a true new error event when the property err is undefined or not available

//saved in a file named typedefs.jsdoc, that is in your jsdoc crawl path
/**
    * @typedef string
    * @author me
    * @description A string literal takes form in a sequence of any valid characters. The `string` type is not the same as `string object`.
    * @property {number} length The length of the string
    * @property {number} indexOf The occurence (number of characters in from the start of the string) where a specifc character occurs
    * @property {number} lastIndexOf The last occurence (number of characters in from the end of the string) where a specifc character occurs
    * @property {string|number} charAt Gives the character that occurs in a specific part of the string
    * @property {array} split Allows a string to be split on characters, such as `myString.split(' ')` will split the string into an array on blank spaces
    * @property {string} toLowerCase Transfer a string to be all lower case
    * @property {string} toUpperCase Transfer a string to be all upper case
    * @property {string} substring Used to take a part of a string from a given range, such as `myString.substring(0,5)` will return the first 6 characters
    * @property {string} substr Simialr to `substring`, `substr` uses a starting point, and then the number of characters to continue the range. `mystring.substr(2,8)` will return the characters starting at character 2 and conitnuing on for 8 more characters
    * @example var myString = 'this is my string, there are many like it but this one is HOT!';
    * @example
    //This example uses the string object to create a string...this is almost never needed
    myString = new String('my string');
    myEasierString = 'my string';//exactly the same as what the line above is doing
*/

1
残念ながら、これは@typedefタグ内のタイプを未解決として強調表示するPHPStormでは機能しません。ええ、まあ、私はそれをここで
デビッドハークネス2013年

エラーをスローするのではなく、インスタンスを作成してQ.reject()に渡すだけです
Arikon 2013

6

Jsdoc3で現在サポートされている構文:

/**
 * Retrieve the user's favorite color.
 *
 * @returns {Promise<string>} A promise that contains the user's favorite color
 * when fulfilled.
 */
User.prototype.getFavoriteColor = function() {
     // ...
};

将来的にサポートされますか?

/**
 * A promise for the user's favorite color.
 *
 * @promise FavoriteColorPromise
 * @fulfill {string} The user's favorite color.
 * @reject {TypeError} The user's favorite color is an invalid type.
 * @reject {MissingColorError} The user has not specified a favorite color.
 */

/**
 * Retrieve the user's favorite color.
 *
 * @returns {FavoriteColorPromise} A promise for the user's favorite color.
 */
User.prototype.getFavoriteColor = function() {
    // ...
};

https://github.com/jsdoc3/jsdoc/issues/1197でgithubのディスカッションを参照してください


1
ちょうど同じものを見つけました。プロジェクトオーナーから上記で参照されているコメントへのリンクgithub.com/jsdoc3/jsdoc/issues/1197#issuecomment-312948746–
Mike Grace

4

推奨になる可能性がある場合でも、これを行う別の方法もあります。重視かもしれないので、誰かがいる間(その答えへのコメントを確認してください)、それは非推奨だと言う他はどちらか一方で結構ですと言います。とにかく完全を期すために報告します。

ここPromise.all()で、配列で満たされたPromiseを返す例を考えてみましょう。ドット表記スタイルでは、次のようになります。

{Promise.<Array.<*>>}

JetBrains製品(PhpStorm、WebStormなど)で動作し、jsforceドキュメントでも使用されます。

この記事を書いている時点で、PHPStormを使用していくつかのドキュメントを自動生成しようとすると、参照が不十分であるにもかかわらず、デフォルトでこのスタイルになります。

とにかく、次の関数を例にとると:

// NOTE: async functions always return a Promise
const test = async () => { 
    let array1 = [], array2 = [];

    return {array1, array2};
};

私は聞かせた場合PhpStormが、私はこれを取得ドキュメントを生成します。

/**
 * @returns {Promise.<{array1: Array, array2: Array}>}
 */
const test = async () => {
    let array1 = [], array2 = [];

    return {array1, array2};
};

0

これが私がやりたいことです(少しやり過ぎかもしれません):

/**
 * @external Promise
 * @see {@link http://api.jquery.com/Types/#Promise Promise}
 */

/**
 * This callback is called when the result is loaded.
 *
 * @callback SuccessCallback
 * @param {string} result - The result is loaded.
 */

/**
 * This callback is called when the result fails to load.
 *
 * @callback ErrorCallback
 * @param {Error} error - The error that occurred while loading the result.
 */

/**
 * Resolves with a {@link SuccessCallback}, fails with a {@link ErrorCallback}
 *
 * @typedef {external:Promise} LoadResultPromise
 */

/**
 * Loads the result
 *
 * @returns {LoadResultPromise} The promise that the result will load.
 */
function loadResult() {
    // do something
    return promise;
}

基本的に、いくつかのドキュメントへのリンクを使用して基本Promiseを定義し(この場合はjQueryのものにリンクしています)、Promiseが解決または失敗したときに呼び出されるコールバックを定義してから、にリンクする特定のPromiseを定義します。コールバックドキュメント。

最後に、特定のpromiseタイプを戻り値の型として使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.