gpt4 book ai didi

javascript - NativeScript http.getJSON 和异步等待

转载 作者:行者123 更新时间:2023-11-28 17:09:11 25 4
gpt4 key购买 nike

我在 NativeScript 应用程序中处理 promise 后的返回时遇到问题。 return get在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,但这不起作用。

更新:

这是我使用 var resp = ProvjeraBarcode.CheckLenght(result.text); 调用 CheckLenght: function(id) 的代码,它返回 [对象 promise ]

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);
}
);
}

我对此感到很困难。感谢大家的帮助和支持

最佳答案

这样看你的代码:

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;
}

您可以像这样重写代码:

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在函数声明前面使其返回一个 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

关于javascript - NativeScript http.getJSON 和异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54964305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com