2016-12-02 119 views
1

我正在使用Node.js和AWS DynamoDB實現我的服務(aws-sdk)。來自異步調用的承諾和條件

目前還不清楚,我如何實現與承諾以下情形:

  1. 我得到一個要求修改的實體指定屬性的
  2. 我試圖發現在DB的實​​體(異步調用find
  3. 如果沒有找到該實體然後創建一個與初始狀態(異步調用createInitialStateObject
  4. 修改實體(根據特定的規則這是在DB之前或剛好在步驟3中創建)(異步調用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)立即創建並解決Promise。

除此之外,你應該利用適當的鏈接和停止嵌套的東西這麼多。一旦你在一個鏈中,你甚至不需要解決一個空的承諾,因爲一個非可容納對象的返回值被解釋爲這個。

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 )'然後'必須返回一個承諾 –