Невозможно получить значение обещания вне функции ionic - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь получить значение обещания вне моей функции, но оно возвращает undefined

Вот мой код, который я пробовал:

Home.ts

class Home{

dd:any;

constructor(public dbHelpr:DbHelperProvider){

}

getData(){

   this.dbHelpr.getRecordById("51").then(function(res:any){

               dd = res
                console.log("dd in "+dd);

              }); 

              console.log("dd out "+dd);
           }

}

DbHelperProvider.ts

getRecordById(_id){

    return new Promise(resolve => {
      this.db.get(_id).then(function (doc) {

        resolve(doc);
      }).catch(function (err) {
        console.log(err);
        resolve("fail");
      });
    })

  }

Мой журнал показывает: дд внутри abcdef

дд снаружи не определено

Как мне решить эту проблему?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Проблема в том, что вы не используете arrow function. Использование функции commom в обратном вызове не предоставит доступ к переменным вне ее, вам нужно и arrow function в вашем обратном вызове. Также вам нужно использовать this, чтобы иметь доступ к свойству dd вашего класса

getData(){
  this.dbHelpr.getRecordById("51").then((res:any) => {
    console.log("dd in " + this.dd); // prints undefined
    this.dd = res;
    console.log("dd out " + this.dd); // prints the value
  });
}

Также есть то, что VicJordan сказал об асинхронности, поскольку второй console.log находится вне его, он вызывался раньше, и поскольку ваше свойство dd не инициализируется ни с каким значением, оно будет undefined.

Надеюсь, это поможет.

0 голосов
/ 27 августа 2018

Поскольку console.log("dd out "+dd); вызывается раньше console.log("dd in "+dd); (из-за асинхронного характера обещания), из-за которого вы получаете неопределенное значение для dd out.

Назначить doc глобальному var внутри .then, т. Е.

  this.db.get(_id).then(function (doc) {

    resolve(doc);
    // assign to global var here.
  })
...