2016-04-30 19 views
1

約束を返すfunc1の機能があります。 func2で私は約束を始めました。 私はここでやりたいことは、私はfunc1古い約束のチェーンでメッセージを解決したい、と私はこのコードがあまり複雑でないようにしたいです。私は昔の約束チェーンへの余分なステップを追加することによってそれを行うだろうfunc2約束の約束に加入する方法

var func1 = function(){ 
    return new promise(function(resolve, reject){ 
    //some operations here 
    }); 
}; 

var func2 = function(){ 
    promise.resolve(someFuncSync()) 
    .then(function(){ 
    //this is the old promise chain 

     func1() 
      .then(function(message,error){ 
      return message; 
      //i want use this return value in old promise chain 
      }); 

     console.log(message); 
     //printing func1 returned message in old promise chain 
    }) 
}; 
+0

あなたがこれを行うことはできませんあなたは、アクセス権を持っていますfunc1の中でのみメッセージします。 – Grundy

+0

@JonathanLonowski回答として投稿する必要があります。 'then(function(message){console.log(message)})'を使用してください。 – dfsq

+0

「鎖」とはどういう意味ですか?シーケンス? func1とfunc2のそれぞれの解決値で何をしたいですか? –

答えて

0

にチェーンを約束するfunc1約束に参加するための最良の方法は何ですか。

これは、新しいプロミスチェーンの古いプロミスチェーンから解決された値を使用する必要がないことを前提としています。

var func1 = function(){ 
    return new promise(function(resolve, reject){ 
    //some operations here 
    }); 
}; 

var func2 = function(){ 
    promise.resolve(someFuncSync()) 
    .then(function(arg){ 

     return promise.all([ 
      arg, // Argument that original promise resolved with 
      func1() // The new extra promise 
     ]) 
    }) 
    .spread(function(arg, message){ 
     // Now i have the new message and also the return value from the old promise. 
     console.log(message); 
     //printing func1 returned message in old promise chain 
    }) 
}; 
1

ちょうど.then()ハンドラ内から新しい約束を返し、それが自動的に前のチェーンに追加されますし、古い約束チェーンの解決された値を制御します。

新たに返された約束が解決され、内側の約束が最終的な解決済みの値を制御するまで、外側約束は解決されません。私はチェーンに追加しreturn func1()にここにあなたの呼び出しの前にreturnのステートメントを追加しました:

var func2 = function(){ 
    promise.resolve(someFuncSync()) 
    .then(function(){ 
    //this is the old promise chain 

     // ADDED return here 
     return func1() 
      .then(function(message,error){ 
      return message; 
      //i want use this return value in old promise chain 
      }); 
    }) 
}; 

それはあなたが上記の持っているすべてのもののように見えるので、私はあなたのコードに変更したいいくつかの他のものがあります。これは、あなたが行うことができます

var func2 = function() { 
    someFuncSync(); 
    return func1(); 
}; 

行います:

func2().then(function(message) { 
    // process message here 
}, function(err) { 
    // process err here 
}); 
ちょうどこのまで蒸留することができます変化の210

概要:

  1. それは常に同期だ場合の約束にsomeFuncSync()をラップする必要はありません。あなたはそれを呼び出してから約束を始めることができます。
  2. 標準約束は単一の値だけ(ない(message, error)のようなものを返すので、それでreturn messageとコールバックの理由は本当にありません。あなただけの直接約束を返すことができます。
  3. 追加returnfunc1()の前にあるので、我々は戻ってきています。。約束
+0

@ doug65536 - Worksここで完璧に良い:https://jsfiddle.net/jfriend00/pxbLvz2w/ – jfriend00

+0

ええ、あなたは正しい。 'return'は、その行の' return'の後にもうテキストがなければ、ASIの問題になります。 – doug65536

+0

個人的には、前回の関数呼び出しと同じ行に常に最初の '.then()'を入れました。これ以上のことがあることをより明確に読んでいると思うので、この特定のスキームはここでOPが使用していたものでした。 – jfriend00

1

マンは、これらの答えのいくつかは実際に物事をoverthinkingている約束の美しさはそのシンプルさです。

return func1().then(func2)