44411


nodejs の逐次処理について質問です。

  * JavaScript Promiseの本  
<https://azu.github.io/promises-book/>

上記サイトを参考に、コールバック地獄を回避するために、以下のようなタスク１～３の逐次処理するロジック（タスクの処理結果を次のタスクに渡す）を記載し、希望通りタスク１～３が逐次実行されるのは確認できました。  
ですが、js 初心者のため、以下の疑問が出てきましたので質問させていただきました。  
（抽象的な質問で申し訳ありません。。。）

(1) このやり方が一般的なのでしょうか？  
(2) このやり方での問題点は何かありますでしょうか？  
とりあえず動作確認のみ行いました。が、このロジックが正しいかどうかの判断がついていません。

[code]

    // 何かしらの非同期処理
    // この関数では入力パラメータの value に +1 するだけ
    // 入力パラメータの error は reject を発生させて、catch() が動作しているか確認用
    function async_task(value,error) {
      return new Promise(function (resolve, reject) {
        setTimeout(function () {
          if (error === undefined){
            resolve(value+1);
          }
          else {
            reject(error);
          }
        }, 1000);
      });
    }
    
    // var promise = async_task(1,'task1 error'); // 処理1(エラー発生させる場合)
    var promise = async_task(1); // 処理1
    promise.then( (result) => {
      console.log(`task1 end: result:${result}`);
      return async_task(result); // 処理2
    }).then( (result) => {
      console.log(`task2 end: result:${result}`);
      return async_task(result); // 処理3
    }).catch( (error) => {
      // どっかでエラーが発生した
      console.log(error);
    }).then( (result) => {
      // 最後のまとめ処理
      console.log('complete');
    });
    
[/code]

以上、宜しくお願いいたします。


CC BY-SA 4.0
2018-05-30T03:23:08.073
44394
2018-05-30T09:03:45.230
2018-05-30T05:09:44.520
13909
13909
question
javascript node.js
nodejsでの逐次処理について


Promise のロジックに関しては全く問題がないと思います  
質問者様が考えるように、Promiseを使った記述はなんでもできる代わりに、冗長になりがちです  
この問題を解決するために async / await という機能が追加されました

async function は戻り値を Promise に強制してくれます

[code]

    console.info( (async function() {return 10;})() ) // Promise {status: "resolved", result: 10}
    console.info( (async function() {return new Promise((resolve) => setTimeout(resolve, 1000));})() ) // Promise {status: "pending"}
    
[/code]

await は async function の中にのみ記述できます  
await someValue someValue を Promise に強制し、resolved になり次第、後続の処理を実行します

[code]

    (async function() {
      // 1
      await 'hello';
      // 3
      await new Promise((resolve) => setTimeout(resolve, 1000));
      // 4
    })();
    // 2
    
[/code]

promise の reject には throw が対応し、  
promise の catch には try ... catch が対応します

async / await を使って記述してみると、以下のようになると思います

[code]

    {
    const waitFor = async (ms) => {
      return new Promise((resolve) => setTimeout(resolve, ms));
    }
    const fakeAjax = async (value, error) => {
      await waitFor(1000);
      if (error) {
        throw new Error('fakeAjax error');
      } else {
        return value + 1;
      }
    }
    
    const task1 = async (arg) => {
      console.log(`task1 start`);
      return await fakeAjax(arg/*, 'task1_error' */);
    };
    const task2 = async (arg) => {
      console.log(`task2 start`);
      return await fakeAjax(arg);
    };
    try {
      const initialValue = 1;
      const task1Result = await task1(initialValue);
      console.log(`task1 end: result:${task1Result}`);
      const task2Result = await task2(task1Result);
      console.log(`task2 end: result:${task2Result}`);
    } catch (e) {
      console.info(e);
    }
    console.info('complete');
    }
    
[/code]


CC BY-SA 4.0
2018-05-30T09:03:45.230
44411
2018-05-30T09:03:45.230
9796
44394
answer