TL;DR :はい、同期メソッドから通常の値を返し、それら$q.all
を入力パラメーターとして使用します。それらを正しく処理します。
長い答え
angular コード$q.all
を調べると、この行で入力パラメーターがどのように処理されるかがわかります。
function all(promises) {
....
forEach(promises, function(promise, key) {
....
ref(promise).then(function(value) {
したがって、各パラメーターは、この行で定義されref
た関数に渡されます。引数を取り、それがプロミスの場合はそれを返しますref
if (value && isFunction(value.then)) return value;
そうでない場合、値は新しく作成されたプロミスでラップされ、返されます。その約束はできるだけ早く解決されますが、このイベントループの反復では解決されません。
return {
then: function(callback) {
var result = defer();
nextTick(function() {
result.resolve(callback(value));
});
return result.promise;
}
};
これは、同期メソッドから約束されていない値を安全に返すことができることを意味します。
function asyncFirst() {
var def = $q.defer();
$timeout(function(){
$scope.first = true;
def.resolve();
}, 1000);
return def.promise;
}
function syncSecond() {
$scope.second = true;
return {
data1: 'abc',
data2: 123
};
}
$q.all([
asyncFirst(),
syncSecond()
])
.then(function(){
$scope.all = true;
});
この jsbin の例で実際の動作を確認してください
編集: ユーザー @Bergi は、必要に応じて$q.when
ソースで通常の値をプロミスに変換できることを示唆していますが$q.when
、関数を使用してref
値をプロミスに変換し、次のイベント ループの反復でプロミスを解決します。厳密に言えば、遅延なしで返されるため、メソッド自体は同期です。ただし、結果はすぐに promise にラップされ、次のイベント ループの反復まで使用されません。これは、sync メソッドがそのまま使用されていないことを意味します。少なくとも、ほとんどの人が同期方法を想像するわけではありません。の全体的な結果は$q.all
、非同期などの同期メソッドを使用する予定ですが、次の反復で解決されます。この警告を考慮してください。