2016-10-20 47 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);