2016-09-21 48 views
0

我想检查,如果给定的clientName存在于Observable Collection中,但是在异步运行的原因中,我根本没有得到“false”返回值。如何改变我的功能同步 - 我想不使用回调 - 刚刚返回真/假在Observable sync中进行搜索

checkIfClientNameIsUnique(clientName: string): boolean { 
    var isUnique = true; 
    this.getAll() 
     .subscribe(clients => { 
      clients.forEach(client => { 
       if (clientName == client.name) { 
        isUnique = false 
       } 
      }) 
     }); 
    return isUnique 
} 

回答

0

我看到三个选项:

  1. 使checkIfClientNameIsUnique返回承诺,那么你 可以使用它例如checkIfClientNameIsUnique(name).then(isUnique => {...})
  2. 将所有客户端加载到初始状态的数组。我想你有ClientsService那里你可以把客户端数组,然后你的 checkIfClientNameIsUnique方法可以同步并使用已经加载的 客户端数组。

3.如果你发射到ES6你可以使用异步等待关键字,它会看起来像这样。

checkIfClientNameIsUnique(clientName: string): Promise<boolean> { 
    return new Promise((resolve, reject) => { 
     this.getAll() 
      .subscribe(clients => { 
       for (let client of clients) { 
        if (clientName == client.name) { 
         resolve(false); 
         break; 
        } 
       } 
       resolve(true); 
      }); 
    }); 
} 
// ... 

async main() { 
    let isUnique = await checkIfClientNameIsUnique(name); 
} 
+0

如何将checkIfClientNameIsUnique body转换为Promise?我的问题是将this.getAll()参数发送到Promise主体 – Avocado20

+0

我在我的答案中添加了示例,让我知道它的工作原理:) –

+0

是否有任何方法使它在没有ECMA6的情况下为异步?或者像你在第1点中提到的那样使用它? – Avocado20