NativeScript http.getJSON и async ждут - PullRequest
0 голосов
/ 03 марта 2019

У меня проблемы с обработкой возврата после обещания в моем приложении NativeScript.Возврат выполняется до того, как http.getJSON получит данные.Это просто пропустить возврат неизмененной (статус) переменной.Я пытался использовать await , но это не сработало или я не использовал его правильно.Вот мой код

const check = {  
CheckLenght: function(id) { 
    var status = false; 
    var response = checkPoints(id); 

    if(response > 10){
        status true;
    } else {
        status false;
    } 

    console.log("This is response: " + status); // this shows up before getJSON is returned as "This is response: false"

    return status;  // always returns false
 }  
} 


function checkPoints(id){
    let points; 
    http.getJSON('MY_API_URL' + id)
   .then(function (response) {  
        points = response[0].point; 
   }, function(error) {
       console.log("Server err."); 
   }) 

 console.log("This output shows up before - This is response: false ");
 return points;  
} 

Есть ли способ заставить это работать?Я пытался с Observable, но это не работает эфир.

ОБНОВЛЕНИЕ:

Вот код, откуда я звоню CheckLenght: function(id), используя var resp = ProvjeraBarcode.CheckLenght(result.text);, и он возвращает [обещание объекта]

function skeniraj(){ 
barcodescanner.scan({
    formats: "QR_CODE, EAN_13",    
    cancelLabel: "Odustani. Probajte Volume tipke",  
    closeCallback: function () { console.log("Scanner closed"); },  
    openSettingsIfPermissionWasPreviouslyDenied: true  
  }).then(
      function(result) {
        console.log("Scan format: " + result.format);
        console.log("Scan text:   " + result.text);  

//#########################            

      var resp = ProvjeraBarcode.CheckLenght(result.text);

//########################## 

       console.log("Show response: "+JSON.stringify(resp)); 
       // output is: "[object Promise]"


        if(resp === "true"){ 
            // if true... 
                setTimeout(func, 50);
                function func() {
                    dialogs.confirm({
                        title: "Kartica je valjana",
                        message: "Pohranite karticu u memoriju?",
                        okButtonText: "Pohrani",
                        cancelButtonText: "Odustani", 
                    }).then(function (response) { 
                        console.log("Dialog result: " + response);
                        if(response){  
                        // save details to storage...

                        } 
                    });
                } 

            } else {
                // .... do something else...
            } 
      },
      function(error) {
        console.log("Nista nije skenirano Err. " + error);
        // pokreni rucni unos
        setTimeout(rucniUnos, 50); 
      }
  ); 
 }

У меня тяжелые времена с этим.Спасибо за помощь и поддержку

1 Ответ

0 голосов
/ 03 марта 2019

Посмотрите на свой код так:

function checkPoints(id){

  let points;
  // make a new variable, nothing is assigned so give it undefined

  http.getJSON('MY_API_URL' + id).then(...)
  // Promise? handle later, go to next line.

  return points;
  // return undefined
} 

Очки всегда будут undefined. Вы присваиваете point внутри http.getJSON then, поэтому даже если бы эта функция была синхронной, point внешней области видимости был бы undefined. Редактировать Вы бы не использовали then, если бы функция была синхронной, а point был бы изменен, мой плохой!

Вы можете изменить свой код так, чтобы checkPoints() возвращал Promise, что гарантируетвам данные были возвращены.

function checkPoints(id){
  return http.getJSON('MY_API_URL' + id).then(
    function (response) {  
      return response[0].point;  <-- return the response[0].point
    },
    function(error) {
      console.log("Server err."); 
    })
}

или с функцией стрелки

const checkPoints = (id) => http.getJSON(`MY_API_URL${id}`)
  .then(response => response[0].point)
  .catch(error => console.log("Server err."))

И в вашей функции вы можете использовать async / await:

...
//             V checkLengtht has to be an async function, otherwise it can't use await
CheckLenght: async function(id) { 
  var status = false;
  var response = await checkPoints(id);
      if(response > 10){
        status true;
    } else {
        status false;
    }
  return status;
}

Youможете переписать ваш код следующим образом:

CheckLenght: async function(id) { 
  const points = await checkPoints(id);
  return (points > 10) // return true if points > 10, else return false. Note that this function's return will be wrapped in Promise.
}

Обратите внимание, что CheckLength теперь является асинхронной функцией, то есть возвращает Promise;когда вы используете его, вы должны использовать await или .then().

Вы также можете полностью отказаться от async / await:

...
CheckLenght: id => checkPoints(id).then(points => points > 10);

Как использовать async/ await

Добавление async перед объявлением функции приводит к возвращению Promise.

const add = (a, b) => a + b
add(1, 2) // 3

const add = async (a, b) => a + b
add(1, 2) // Promise(...)
add(1, 2).then(res => console.log(res)) // 3

await может использоваться внутри функции async для получения ответа Promise.

const main = async () => {
  const res = await add(1, 2)
  console.log(res)
}

main() // 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...