从使用promise的函数返回布尔值?

时间:2017-09-24 03:38:32

标签: javascript node.js asynchronous

我有以下辅助功能

private void buildTransportControls() {
    ImageButton mBotonPausa = (ImageButton) findViewById(R.id.mostrar_audiolibro_playpause);
    mBotonPausa.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            MediaControllerCompat mediaControllerCompat = MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this);
            int estado = mediaControllerCompat.getPlaybackState().getState();
            if(estado == PlaybackStateCompat.STATE_PLAYING){
                MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().pause();
            }else if (estado == PlaybackStateCompat.STATE_PAUSED){
                MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().play();
            }else{
                Bundle extras = new Bundle();
                extras.putString("titulo",MostrarAudiolibroActivity.this.audiolibro.getTitulo());
                extras.putString("autor",MostrarAudiolibroActivity.this.audiolibro.getAutor());
                MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().playFromUri(Uri.parse(MostrarAudiolibroActivity.this.audiolibro.getLinkAudiolibro()),extras);
                Log.d(tag,"Voy a tratar de abrir el audio");
            }
        }
    });
    ImageButton mBotonReiniciar = (ImageButton) findViewById(R.id.mostrar_audiolibro_reiniciar);
    mBotonReiniciar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().seekTo(0);
            //MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().play();
        }
    });


}

然后我在另一个文件中调用它:

userExist(email) {
    this.findUserByEmail(email).then(result => {
      return true;
    }).catch(error => {
      return false;
    });

  }

但是东西总是未定义的,因为函数是一个promise,我怎么能等待这个值让我的helper函数返回true或false

2 个答案:

答案 0 :(得分:2)

在大多数情况下,不能使用Thenable。 Promise是表示异步工作的对象。如果您等待该作业通过等待完成,则所有内容都将被冻结,因为JS通常在单线程环境中运行。

如果要在异步内容的同步编程中重新编写代码,请尝试使用async / await语法。我很喜欢。基本上,它看起来像这样:

async function checkUserExists() {
  const exists = await userService.userExists('abc')
  console.log('Exists', exists)
}

你需要意识到承诺仍然在引擎盖下使用。 Babel和Typescript现在都支持这种语法,以便与ES5向后兼容。根据Node,它自7.6以来一直支持。

答案 1 :(得分:1)

使用then方法附加一个将在promise解决后调用的回调:

userService.userExist('abc').then(stuff => {
  console.log(stuff);
})