2016-06-11 17 views
0

私は知っている共通の話ですが、私はJSと約束の世界についての私の理解を確認したいと思います。JS - 約束を待っています

だから私はthenブロックが実際に終了するために、上記のセグメントを待たないという点で失敗している次のコードセグメントを持っています。つまり、私はokCheckの最終的な/正しい値を得ていません。したがって、この問題を解決するために

var okCheck = false; 

User.findOne({publicID: id}, function (err, userInfo) { 
     if (userInfo.checked.indexOf(id) > -1){ 
     okCheck = true; 
     } 
}) 
.then(function() { 
     //do some additional stuff using the boolean okCheck 
} 

- 私はreturnを使用する必要があります理解して何から - これが正しいのですか?

var okCheck = false; 

User.findOne({publicID: id}, function (err, userInfo) { 
     if (userInfo.checked.indexOf(id) > -1){ 
     okCheck = true; 
     } 
     return okCheck; 
}) 
.then(function() { 
     //do some additional stuff using the boolean okCheck 
} 

これは正しいですか?つまり、私はいつもokCheckの最終的な価値を保証しますか?

ありがとうございました。

+0

'findOne'関数は奇妙に見えます:あなたのコードから、コールバック引数をとるように見え、**は約束を返します。どちらのメカニズムもほぼ同じ目的を果たしています。コールバック**または**約束を使用することが期待されます。あなたはそれを正しく呼んでいると確信していますか?コールバックと 'then'ハンドラの両方が呼び出されることを確認できますか?(例えば、それらの中に' console.log() 'コールを追加することによって)? –

+0

これは問題ありません - 私はconsole.logを使ってそれを確認しました。私は以下の答えが良いと思っています - あなたはどう思いますか> – userMod2

+0

答えを見ると、この特定の 'findOne'関数は[Sails.jsの一部です](http://sailsjs.org/documentation/reference/waterline-orm/models/find-one)を参照してください。使用しているライブラリについて言及していれば、コードがどのような機能を使用しているのかを推測する必要がないので、はるかに明確になっています。 ;-) –

答えて

-1

これは、あなたが「.thenを()」を使用するために約束を返す必要があり、それがどのように動作するか方法はありません。

ここで、 ".exec()"は約束を返します。

+0

'.then()'ハンドラの中で使用している ''新しいPromise() ''の理由はまったくありません。 '.then()'ハンドラの中で値を返すことができ、それは現在の約束の解決された値になります。 – jfriend00

+0

私は上記の私の質問 'return okCheck'にあるコードを使用して、それ自体は大丈夫ですか? – userMod2

+0

不要な約束を削除しました。今すぐ正常に動作するはずです –

0

私が理解するところでは、returnを使用する必要があります - これは正しいですか?

はい。しかし、値を入力してもタイミングには何の影響もありません。

thenコールバックの値returnは、返される約束の解決値になり、チェーン内の次のコールバックの引数になります。

外部スコープ変数を非同期コールバックから変更しないでください。

// no `var` here! 
User.findOne({publicID: id}).then(function(userInfo) { 
    return userInfo.checked.indexOf(id) > -1; 
// ^^^^^^ return a boolean 
}).then(function(okCheck) { 
//    ^^^^^^^ receive it here as a parameter 
    … // do some additional stuff using it 
}); 
0

2点:

  • okCheckは確実に外で使用することはできません正しいアプローチは約束が表示されるように、変数値のために何を「待つ」するのではなく、解決されるまで、アクションを延期することですコンテキストのUser.findOneのコールバックまたは連鎖した.thenのコールバック、したがって、それは外側のvarとしてそれを持つことにはメリットはありません、実際にそうすることは悪い習慣です。
  • ダイレクトコールバックがチェーンthen()の両方を使用しようとするべきではありません。

同期であることを、これはマングースであることを仮定し、そしてuserInfo.checked.indexOf()、次のいずれかを記述することができます。

User.findOne()

User.findOne({publicID: id}, function(err, userInfo) { 
    if(err) { 
     console.log(err); 
    } else { 
     if (userInfo.checked.indexOf(id) > -1) { 
      // do additional stuff 
     } else { 
      // do other stuff 
     } 
    } 
}); 

にコールバックを渡しチェーン.then()約束へ返信:User.findOne().exec()

User.findOne({publicID: id}}).exec().then(function(userInfo) { 
    if(userInfo.checked.indexOf(id) > -1) { 
     // do additional stuff 
    } else { 
     // do other stuff 
    } 
}, function(err) { 
    console.log(err); 
}); 

注:Mongooseでなくても、これの多くは依然として適用されます。

関連する問題