让 JS 承诺 return 一个值
Getting JS promise to return a value
我一直在寻找许多优秀的在线示例,这些示例都是关于在 .then() 中获得 return 值的 Promise。但是,在我的示例中一定有不同的东西阻止了它。如果这有所不同,我正在使用 nativescript-vue,但实际上我认为这是一个 Javascript 问题。
我有调用vue文件:
var person;
personService.retrievePerson(this.id).then(function(val) {
console.log("===> received val: " + val);
person = val;
}).catch(function(err) {
console.err(err);
let message = "Unable to find matching person for id. Please try again.";
alert(message)
.then(() => {
console.log(message);
});
});
然后在我的 PersonService.js:
retrievePerson(id) {
new Promise(resolve => {
httpModule.request({
url: PersonAPI,
headers: headers,
method: "GET"
}).then((response) => {
// resolve();
let status = response.statusCode;
if (status === 200) {
let content = JSON.parse(response.content);
Person = JSON.parse(response.content);
console.log("===> returned [200] PersonService.retrievePerson() response: \"" + JSON.stringify(Person) + "\"")
} else if (status === 404) {
console.log("===> returned [404] ... returning null ");
}
// resolve();
}).then(() => {
console.log("===> PersonService.retrievePerson().then() has Person : " + JSON.stringify(Person));
resolve(Person);
}).catch((err) => {
console.error("retrievePerson() caught error: " + JSON.stringify(err));
});
});
}
在我的控制台日志中,我可以看到 ===> returned [200] PersonService.retrievePerson() person JSON 输出,但未显示调用控制台“===> received val”。但我不知道如何将该数据返回给调用 class 以供使用。
感谢您抽出宝贵时间,希望您能指出我这里做错的地方。
您需要 return retrievePerson 函数中的承诺:
retrievePerson(id) {
return new Promise(resolve => {
httpModule.request({
url: PersonAPI,
headers: headers,
method: "GET"
}).then((response) => {
// resolve();
let status = response.statusCode;
if (status === 200) {
let content = JSON.parse(response.content);
Person = JSON.parse(response.content);
console.log("===> returned [200] PersonService.retrievePerson() response: \"" + JSON.stringify(Person) + "\"")
} else if (status === 404) {
console.log("===> returned [404] ... returning null ");
}
// resolve();
}).then(() => {
console.log("===> PersonService.retrievePerson().then() has Person : " + JSON.stringify(Person));
resolve(Person);
}).catch((err) => {
console.error("retrievePerson() caught error: " + JSON.stringify(err));
});
});
}
您肯定需要 return retrievePerson 函数中的承诺。不过也可以清理很多。
您不需要包装承诺,因为您可以 return 原始承诺。你不应该需要双重 .then
s 以及你需要确保你在 .catch
中重新抛出错误所以你的 vue 文件将有机会捕获错误而不是永远不会像以前那样解决。我建议从使用 Person
切换到 const person
以防你 运行 同时两次使用此函数当你异步更改变量时可能会出现竞争条件。
我还想指出另一个潜在问题:您没有在请求中使用我根据控制台日志假设应该使用的 ID。
function retrievePerson(id) {
return httpModule
.request({
url: PersonAPI,
headers: headers,
method: 'GET',
})
.then((response) => {
let status = response.statusCode;
if (status === 200) {
Person = JSON.parse(response.content);
console.log(
'===> returned [200] PersonService.retrievePerson() response: "' +
JSON.stringify(Person) +
'"'
);
return Person;
} else if (status === 404) {
console.log('===> returned [404] ... returning null ');
return null;
}
})
.catch((err) => {
console.error('retrievePerson() caught error: ' + JSON.stringify(err));
throw err;
});
}
我一直在寻找许多优秀的在线示例,这些示例都是关于在 .then() 中获得 return 值的 Promise。但是,在我的示例中一定有不同的东西阻止了它。如果这有所不同,我正在使用 nativescript-vue,但实际上我认为这是一个 Javascript 问题。
我有调用vue文件:
var person;
personService.retrievePerson(this.id).then(function(val) {
console.log("===> received val: " + val);
person = val;
}).catch(function(err) {
console.err(err);
let message = "Unable to find matching person for id. Please try again.";
alert(message)
.then(() => {
console.log(message);
});
});
然后在我的 PersonService.js:
retrievePerson(id) {
new Promise(resolve => {
httpModule.request({
url: PersonAPI,
headers: headers,
method: "GET"
}).then((response) => {
// resolve();
let status = response.statusCode;
if (status === 200) {
let content = JSON.parse(response.content);
Person = JSON.parse(response.content);
console.log("===> returned [200] PersonService.retrievePerson() response: \"" + JSON.stringify(Person) + "\"")
} else if (status === 404) {
console.log("===> returned [404] ... returning null ");
}
// resolve();
}).then(() => {
console.log("===> PersonService.retrievePerson().then() has Person : " + JSON.stringify(Person));
resolve(Person);
}).catch((err) => {
console.error("retrievePerson() caught error: " + JSON.stringify(err));
});
});
}
在我的控制台日志中,我可以看到 ===> returned [200] PersonService.retrievePerson() person JSON 输出,但未显示调用控制台“===> received val”。但我不知道如何将该数据返回给调用 class 以供使用。
感谢您抽出宝贵时间,希望您能指出我这里做错的地方。
您需要 return retrievePerson 函数中的承诺:
retrievePerson(id) {
return new Promise(resolve => {
httpModule.request({
url: PersonAPI,
headers: headers,
method: "GET"
}).then((response) => {
// resolve();
let status = response.statusCode;
if (status === 200) {
let content = JSON.parse(response.content);
Person = JSON.parse(response.content);
console.log("===> returned [200] PersonService.retrievePerson() response: \"" + JSON.stringify(Person) + "\"")
} else if (status === 404) {
console.log("===> returned [404] ... returning null ");
}
// resolve();
}).then(() => {
console.log("===> PersonService.retrievePerson().then() has Person : " + JSON.stringify(Person));
resolve(Person);
}).catch((err) => {
console.error("retrievePerson() caught error: " + JSON.stringify(err));
});
});
}
您肯定需要 return retrievePerson 函数中的承诺。不过也可以清理很多。
您不需要包装承诺,因为您可以 return 原始承诺。你不应该需要双重 .then
s 以及你需要确保你在 .catch
中重新抛出错误所以你的 vue 文件将有机会捕获错误而不是永远不会像以前那样解决。我建议从使用 Person
切换到 const person
以防你 运行 同时两次使用此函数当你异步更改变量时可能会出现竞争条件。
我还想指出另一个潜在问题:您没有在请求中使用我根据控制台日志假设应该使用的 ID。
function retrievePerson(id) {
return httpModule
.request({
url: PersonAPI,
headers: headers,
method: 'GET',
})
.then((response) => {
let status = response.statusCode;
if (status === 200) {
Person = JSON.parse(response.content);
console.log(
'===> returned [200] PersonService.retrievePerson() response: "' +
JSON.stringify(Person) +
'"'
);
return Person;
} else if (status === 404) {
console.log('===> returned [404] ... returning null ');
return null;
}
})
.catch((err) => {
console.error('retrievePerson() caught error: ' + JSON.stringify(err));
throw err;
});
}