Ionic2 / Angular2无法在函数内调用函数

时间:2017-05-18 01:02:35

标签: angular typescript ionic2 http-post cordova-plugins

我正在使用Cordova Facebook插件获取用户名/电子邮件/等(其工作正常),然后想将其插入我自己的数据库中。我已经通过创建一个函数测试了发布到数据库代码,将其绑定到测试按钮,这也很好。但是当我将post-2-db代码放在fb-login代码中时,它会在我的http-post上完全停止执行。我做console.log(step1)并且看得很好,但是我从来没有看到console.log(step2) - 请参阅下面的代码:

// LOGIN TO FACEBOOK
doFbLogin(){
    let permissions = new Array();
    let nav = this.navCtrl;
    //the permissions your facebook app needs from the user
    permissions = ["public_profile"];


    Facebook.login(permissions)
    .then(function(response){
      let userId = response.authResponse.userID;
      let params = new Array();

      //Getting name and gender properties
      Facebook.api("/me?fields=name,gender,email", params)
      .then(function(user) {
        user.picture = "https://graph.facebook.com/" + userId + "/picture?type=large";
        //now we have the users info, let's save it in the NativeStorage
        NativeStorage.setItem('user',
        {
          name: user.name,
          gender: user.gender,
          picture: user.picture,
          email: user.email,
        })
        .then(function(){
          // BEGIN INSERT USER TO DB
          // postRequest() {
            var headers = new Headers();
            headers.append("Accept", 'application/json');
            headers.append('Content-Type', 'application/json' );
            let options = new RequestOptions({ headers: headers });
            let postParams = {
              userName: user.name,
              userEmail: user.email,
              userImage: user.picture,
            }

            console.log("STEP 1");

// IT WORKS UP TO THIS POINT

            this.http.post("http://example.com/post.php", postParams, options)
              .subscribe(data => {
                console.log(data['_body']);
                }, error => {
                console.log(error);// Error getting the data
              });
            //}
            // END DB INSERT CODE

// I NEVER SEE THIS CONSOLE LOG BELOW

            console.log("STEP 2");



          // User Reg complete, push them to app
          nav.push(TabsPage);
        }, function (error) {
          console.log(error);
        })
      })
    }, function(error){
      console.log(error);
    });

  }
}

如果我拿出那段代码,一切正常。我是编码的初学者,我很感激任何彻底的外行级解释和帮助。谢谢。

4 个答案:

答案 0 :(得分:3)

正如史蒂文万克所说,

替换你的

.then(function(response){

.then((response)=>{

否则您的this将引用该函数实例

答案 1 :(得分:2)

如果您将该代码放入一个函数中,那么"这个"改变范围。

this.http.post

"这"是指执行上下文,您刚刚更改并且没有" http"连接。或者如果你使用严格,它甚至会被定义。

尝试使用新的es6箭头功能。他们提供静态"这个"。或者只是传递http对象。

答案 2 :(得分:1)

这表示您对http.post的调用会导致异常。例如,可能未定义thisthis.http。检查控制台窗口,看看是否有任何相关内容。

捕获异常的方法是使用try / catch块:

 try {
    this.http.post("http://example.com/post.php", postParams, options)
          .subscribe(data => {
            console.log(data['_body']);
            }, error => {
            console.log(error);// Error getting the data
          });
   console.log("Successful call!");
 } catch (error) {
  console.log(error);
 }

这可以让您深入了解执行未通过http.post函数调用的原因。

答案 3 :(得分:0)

使用map从服务器获取response并传递给subscribe阻止。

this.http.post("http://example.com/post.php", postParams, options).map((res: Response) => res.json() || {})
.subscribe( (data) => {
    console.log(data['_body']);
}, error => {
    console.log(error);// Error getting the data
});