2016-09-21 17 views
1

これはqを使用して、基本的に私のコードです:は別の約束で約束を呼び出すと、条件付きで

let d = Q.defer(); 
let result = { 
    name: 'peter' 
}; 

d.resolve(result); 
return d.promise; 

しかし、私は今、特定の条件に基づいて、ステップを実行する必要があります。このステップは、約束を返す別のオブジェクトを呼び出すことです。それで正しい言葉なら、私は約束事を入れています。このような

何か:

let d = Q.defer(); 
let result = { 
    name: 'peter' 
}; 

if (someParameter) { 
    otherService.getValue() // Let's say it returns 'mary' 
     .then((res) => { 
      result.name = res; 
     }); 
} 

d.resolve(result); 
return d.promise; 

これは(nameプロパティがまだ 'ピーター' です)が動作しません。おそらく私の内なる約束が後で解決されるという事実のためでしょうか?

私もこれを試しましたが、約束を返すotherServiceを呼び出すと動作しません。

let d = Q.defer(); 
let result = { 
    name: 'peter' 
}; 

d.resolve(result); 
return d.promise 
    .then((data) => { 
     if (someParameter) { 
      // Works 
      data.name = 'john'; 

      // Doesn't work 
      otherService.getValue() 
       .then((res) => { 
        data.name = res; 
       }); 
     } 

     return data; 
    }); 

ここで、名前は「mary」ではなく「john」になります。

明らかに私は約束を誤解していますが、私はそれについて私の頭を包むことはできません。

+0

にあなたのコードを簡素化することができます(http://stackoverflow.com/q/26599798/1048572) – Bergi

答えて

1

約束のコントロールフローは... fun

とにかく、ほとんどの場合、PromisePromiseに埋め込んでチェーン化することができます。あなたがそれらを埋め込んでいる場合は、あなたが埋め込まれたPromiseチェーンreturnする必要があります。

let d = Q.defer(); 
let result = { 
    name: 'peter' 
}; 

d.resolve(result); 
return d.promise 
    .then((data) => { 
     if (someParameter) { 

      // Should work now that we return the Promise 
      return otherService.getValue() 
       .then((res) => { 
        data.name = res; 
        // And we have to return the data here as well 
        return data; 
       }); 
     } 

     return data; 
    }); 

Promiseresolveを値または別のPromiseを取ることができ、それがフローを処理します。したがって、returnthenの内部にある場合、返す値は別のPromiseでもかまいません。機械は私たちのためにアンラッピングを行います。

+0

あなたコードは機能していますが、あまりにも複雑すぎるため、私はそれが役に立たないとみなさなければなりません。 – Bergi

+0

@Bergiあなたがそのように感じて申し訳ありません。私は作者をさらに混乱させないためにOPをコピーしました。コードははるかに表現力豊かなものかもしれません。投稿はPromiseの制御フローに関するものだったので、完全な例を示す必要があります。作者が埋め込み約束などについて混乱しているように思えた。 –

+0

それは複雑だが、私はそれをリファクタリングした。また、ここでの私の例は、私たちが実際のコードで持っているものと比べると些細なものです。しかし、この答えは、私が間違っていたことを私に説明しました。 – Peter

2

遅延の使用は推奨されていません。まったくの場合はQ.Promiseコンストラクタを使用する必要がありますが、それは必要ありません。 Q functionを使用して、あなたの価値を満たした約束を作成してください。

今、あなたは(とすべきである)[約束であれば、他のフロー]を見てください

let d = someParameter ? otherService.getValue() : Q('peter'); 
return d.then(res => ({ 
    name: res 
})); 
関連する問題