
[code]

    aPromise.then(function taskA(value){
      // task A ~何らかの処理~
    }).then(function taskB(value){
      // task B
      // taskBのvalueが最終結果です。
      // この最終結果のtaskBのvalueを格納したい。
    }).catch(function onRejected(error){
        console.log(error);
    });
    
[/code]

例となるコードを書いてみました。  
ここのタスクBのvalueを格納したいので試行錯誤したのですが、  
結果下に書いたコードになりました。

[code]

    var result = '最終結果が入る変数result';
    aPromise.then(function taskA(value){
      // task A ~何らかの処理~
    }).then(function taskB(value){
      // task B 
      //ここのvalueを格納したい。
      result = value;
    }).catch(function onRejected(error){
        console.log(error);
    });
    
[/code]

プログラミング初心者で、自信が無く、  
これがスマートな方法なのかが気になって質問しました。

よければ回答をお願いします。


CC BY-SA 3.0
2015-06-06T05:39:29.217
11033
2019-07-29T01:02:36.290
2019-07-28T02:02:38.100
9008
10023
question
javascript promise
javascriptでpromiseの最終結果をスマートに変数へ格納する方法


promise内での計算値(result, AJAXの取得値など)を他モジュール(DOM操作とか)で利用したい、ということだと思います.  
グローバル変数の危険さ、タイミング調整の難しさを考慮すると、then内で完結するように書くのが望ましいです.  
resultを使った処理中に起こるエラーもcatch内で処理できるようになるので、処理が一箇所にまとまって幸福度が高くなります.

[code]

    // ----otherModule.js----
    OtherModule.otherModuleFunction1_UseTaskB_Result = function(result) {
        // がんばってresultを使う処理部分を固めて、モジュール化します
        // taskBの計算値を引数経由で渡すと安全です
    };
    OtherModule.otherModuleFunction2_UseTaskB_Result = function(result){
        // 適度に分割
    }
    
    // ----promiseHandle.js----
    aPromise.then(function taskA(resolvedValue){
      // task A ~何らかの処理~
      return doSomething1(resolvedValue);
    }).then(function taskB(valueFromTaskA){
      var result = doSomething2(valueFromTaskA);
      OtherModule.otherModuleFunction1_UseTaskB_Result(result);
      OtherModule.otherModuleFunction2_UseTaskB_Result(result);
    }).catch(function onRejected(error){
      console.log(error);
    });
    
[/code]

複数のPromiseを使う場合は、全員の完了を待ち合わせをするPromise.allも併用するといい感じに実現できると思います.


CC BY-SA 3.0
2015-06-08T04:04:03.837
11098
2015-06-08T04:04:03.837
9796
11033
answer


最近では、`async` `await` を使うのがスマートかと思います。

[code]

    async function myFunction(aPromise) {
      try {
        // もし taskA() も Promise を返すのだったら、'await taskA(...)'.
        let result = taskB(taskA(await aPromise));
        ...
      } catch (error) {
        console.log(error);
      }
    }
    
[/code]


CC BY-SA 4.0
2019-07-28T23:45:27.493
56995
2019-07-29T01:02:36.290
2019-07-29T01:02:36.290
3475
3475
11033
answer