2016-10-20 43 views
0

流程是:如何在節點js上的貓鼬中生成唯一的密鑰?

  1. 我產生currentKey(鑰匙由-分開3個字組成)
  2. 檢查我的集合中的任何文件已經currentKey
  3. 如果不是 - currentKey將被粘貼到我的收藏中的特定文檔中。
  4. 但是,如果是 - currentKey將會重新生成並重新開始。

問題是貓鼬有異步回調,當查詢將完成執行時將運行。而且我不知道如何用這種異步流程來實現我的流程。作爲例子(這是爲了方便剛例如,它不是一個現有框架或等),我所做的關於PHP有如下:

$currentKey = someService.GenerateKey(); 
//exists() returns true or false 
while($db->find('tablename', ['key' => $currentKey])->exists()) 
{ 
    $currentKey = someService.GenerateKey(); 
} 
//It's update 'tablename' where `id` equals to $someUserId and set `key` to $currentKey value 
$db->update('tablename', ['id' => $someUserId], ['key' => $currentKey]); 

你能幫助我,請?

回答

0

承諾是爲此設計的。

function generateUniqueKey(modelId) { 
    return new Promise((resolve, reject) => { 
    currentKey = someService.GenerateKey(); 
    MyModel.count({ key: currentKey }) 
     .then(count => { 
     if (count > 0) { 
      generateUniqueKey(modelId); 
     } else { 
      MyModel.update({ id: modelId }, { $set: { key: currentKey } }) 
      .then(resolve(currentKey)); 
     } 
     }) 
     .catch(err => reject(err)); 
    }); 
} 

generateUniqueKey(someUserId).then(key => console.log('Generated unique key:', key)); 

但是,如果你不關心結果,你可以只取出Promise機制,讓自身的generateUniqueKey()方法結束。

function generateUniqueKey(modelId) { 
    currentKey = someService.GenerateKey(); 
    MyModel.count({ key: currentKey }) 
    .then(count => { 
     if (count > 0) { 
     generateUniqueKey(modelId); 
     } else { 
     MyModel.update({ id: modelId }, { $set: { key: currentKey } }) 
      .then(() => console.log('Generated unique key:', currentKey)) 
      .catch(err => console.log(err)); 
     } 
    }) 
    .catch(err => console.log(err)); 
} 

generateUniqueKey(someUserId);