让 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 原始承诺。你不应该需要双重 .thens 以及你需要确保你在 .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;
    });
}