2017-08-31 8 views
0

私はAmazon DynamoDBへの同時呼び出しを3回行うNode.js関数に取り組んでいます:put(情報を保存)、query(情報を取得)、およびupdate(条件付きで情報を更新)コールはお互いに依存しません。エラーが予想される場合、Node.jsで複数の並列コールバック/約束を処理する方法は?

var docClient = new AWS.DynamoDB.DocumentClient(); 
docClient.put(params1, callback); 
docClient.query(params2, callback); 
docClient.update(params3, callback); 

または約束と::

var promise1 = docClient.put(params1).promise(); 
var promise2 = docClient.query(params2).promise(); 
var promise3 = docClient.update(params3).promise(); 

は、私は、クエリの呼び出しの結果を処理したいのですが、唯一の他の二つの呼び出し後

AmazonのSDKは、非同期コールバックのいずれかを使用してそれらを呼び出すことができます落ち着いた。私は彼らがどんな順序で起こっても、成功しても気にしません。

更新が例外をスローする可能性があることを除いて、Promise.all()はそのトリックを行います(Amazonは例外として条件を満たす条件付き更新を処理します)。

どうすれば解決できますか?

+0

おかげで、それは私の編集の前でした。第二のアプローチがより好きだと思う、それは優れていると思う。 – Evert

答えて

1

すべての結果を返すPromise.all()の独自のバリアントを作成することは非常に難しくありません。いずれかが失敗した場合はnullとなります。例:

// Sorry, completely blanking on a better function name. 
function myAll(promises) { 

    return new Promise((res, rej) => { 
    var settled = 0; 
    var results = []; 
    promises.forEach(function(promise, index) { 
     promise.then(result => { 
     results[index] = result; 
     }).catch(err => { 
     results[index] = null 
     }).then(() => { 
     settled++; 
     if (promises.length === settles) { 
      res(results); 
     } 
     }); 
    }); 

    }); 
} 

上記の機能は基本的にすべての結果店舗、すべての約束をthenを呼び出し、それがすべての結果を持っていたら、それはトップ約束を返します。これは、Promise.all();の実装方法と非常によく似ています。

しかし、私はそれが私がそれを実装する方法は完全にはわかりません。 1つは、エラーはすべてnullに変換され、それ以上の「失われた」。私はこれが良いデザインではないと思います。なぜなら、あなたが期待する特定の例外をキャッチするのは良い考えです。たとえば、クライアントがPreconditionFailed例外をスローしたと仮定し、更新呼び出しのためだけに注意してください。ただそれを捕まえるのは簡単です。

例:答えを受け入れるための

Promise.all([ 
    docClient.put(params1).promise(), 
    docClient.query(params2).promise(), 
    async() => { 
    try { 
     return docClient.update(params3).promise() 
    } catch (e) { 
     if (!(e instanceof PreconditionFailedException)) { 
     // rethrow 
     throw e; 
     } 
     return null; 
    } 
    } 
]); 
+0

私はテストしていませんが、あなたの2番目の答えはさらに良くなりました、ありがとう! – justkevin

関連する問題