2016-12-02 12 views
1

私はNode.jsをAWS DynamoDB(aws-sdk)で使用してサービスを実装しています。非同期呼び出しからの約束と条件

それは約束で次のシナリオを実装する方法を私のため不明だ:

  1. 私は指定された属性
  2. でエンティティを変更する要求を取得し、私はDB(非同期でエンティティを見つけようとしていますエンティティは、初期状態とのいずれかを作成する見つからない場合find
  3. を呼び出す(非同期前DBであったか、または単にステップ3で作成された)特定の規則に従ってエンティティを(変更createInitialStateObject
  4. を呼び出す(非同期呼び出しapplyModifications

これが私の最初の試みである:

function scenario(params) { 
    find(params).then((data) => { 
     let objectExists = checkExistense(data); 
     if (!objectExists) { 
      createInitialStateObject(params).then((data) => { 
       console.log("Object created"); 
       // OK 
      }).catch((err) => { 
       console.error("Object not created"); 
       // exit and return error 
      }); 
     } 
     applyModifications(params).then((data) => { 
      // OK, return data 
     }).catch((err) => { 
      // exit and return error 
     }); 
    }).catch((err) => { 
     // exit and return error 
    }); 
} 

しかし、ここでの欠陥は、作成は、次々に起こるにバインドいない、変更前の起こりうるということです。

もう一方の試みはうまくいくが、ちょっと変わったようだ。オブジェクトが既に存在する場合は、私は空の約束を呼び出して呼び出します:

function scenario(params) { 
    find(params).then((data) => { 
     let conditionalPromise = new Promise((resolve) => { 
      resolve(null); 
     }); 
     let objectExists = checkExistense(data); 
     if (!objectExists) { 
      conditionalPromise = createInitialStateObject(params); 
     } 
     conditionalPromise.then((data) => { 
      applyModifications(params).then((data) => { 
       // OK, return data 
      }).catch((err) => { 
       // exit and return error 
      }); 
     }).catch((err) => { 
      // exit and return error 
     }); 
    }).catch((err) => { 
     // exit and return error 
    }); 
} 

これは正しい方法で実装する必要がありますか?

答えて

2

「空」または同期を作成しています。約束は珍しいことではない。それを行う短い方法さえあります:Promise.resolve(value)はすぐにプロミスを作成して解決します。

これ以外にも、適切な連鎖を使用して、ネストを止めることが大切です。チェーン内にいれば、空でないプロミスムを解決する必要はありません。非ネスト可能なオブジェクトの戻り値はまさにこれと解釈されるからです。

function scenario(params) { 
    return find(params) 
    .then(data => { 
     let objectExists = checkExistense(data); 
     if (!objectExists) { 
     return createInitialStateObject(params); 
     } 
     // if we return nothing (or null in your case) this will be the same as return Promise.resolve() 
     return null; 
    }) 
    .then(data => applyModifications(params)) 
    .then(data => console.log(data)) 
    .catch(err => console.log(err)); 
     // exit and return error 
} 
+0

'非thenable object'の戻り値が' Promise.resolve(値)を返すことと等価である ' - [仕様](https://promisesaplus.com/#point-40に従ってため) '.'は約束を返さなければなりません –

関連する問題