承诺解决不起作用

时间:2017-01-09 18:21:42

标签: javascript angular promise

我无法解决我的Angular 2代码出错的问题。我的承诺没有返回正确的结果。

我的代码如下所示:



  this.addPlan('My plan title9', "YES9")
  .then((id)=>{
      console.log('Promise return was: ' + id);
    })
  .catch((err)=>{
      console.log('Call to addPlan failed with err = ' + err);
    });

  addPlan(title, security)
  {
    let timeStamp 	= new Date().toISOString();
    let plan 		= {
        _id 		  : 'PLAN:' + timeStamp,
        title 		: title,
        security 	: security,
        notes     : [],         
        flags     : [],         
        created   : timeStamp,
        updated 	: timeStamp
      };

    return new Promise(resolve =>
    {
      var theID;
      this._DB.put(plan)
      .then(function (response) {
        console.log(JSON.stringify(response));
        resolve(response.id);
        theID = response.id;
      })
      .catch((err) =>
      {
        console.log('addPlan error is: ' + err);
        this.success = false;
      });

      if(this.success)
      {
        this.handleSyncing();
        resolve(theID);
      }

    });
  }




当调用this.addPlan(...)时,服务器日志为:

Promise return was: undefined 
{"ok":true,"id":"PLAN:2017-01-09T18:16:50.094Z","rev":"1-ac45a4785982fcbbcb46dd099431ecb6"}

承诺的回报是不确定的,因为它应该是' id'的价值。此外,控制台首先显示Promise消息,但我希望它在promise返回后显示。

显然我在这里犯了一个新手错误,但我无法看到它是什么。

2 个答案:

答案 0 :(得分:3)

错误是if(this.success),因为您将异步代码视为同步。您创建的新承诺块内的所有内容都将同步运行。

观察输出,理解会发生什么应该是相当直接的:

  1. if将评估为true并解析尚未定义的内容 值。
  2. put()函数调用完成并将响应记录到控制台。
  3. 您还在实施deferred anti-pattern。由于put()函数已经返回一个,因此无需创建新的承诺。只需返回那个并从.then()中返回响应,它将把它包装在一个promise中并解决它。我在下面的代码中省略了this.handleSyncing();,因为它不完全清楚它是做什么的。

    function addPlan(title, security) {
      let timeStamp = new Date().toISOString();
      let plan = {
        _id: 'PLAN:' + timeStamp,
        title: title,
        security: security,
        notes: [],         
        flags: [],         
        created: timeStamp,
        updated: timeStamp
      };
    
      return this._DB.put(plan)
        .then((response) => {
          console.log(JSON.stringify(response));
          return response.id;
        //^^^^^^----- This will wrap the response.id in a promise and will be the resolved value 
        })
        .catch((err) => {
          console.log('addPlan error is: ' + err);
          this.success = false;
        });  
    }
    

答案 1 :(得分:2)

您不必创建新的承诺

你可以回复“this._DB.put(plan)”承诺:

addPlan(title, security){
    let timeStamp   = new Date().toISOString();
    let plan        = {
        _id           : 'PLAN:' + timeStamp,
        title       : title,
        security    : security,
        notes     : [],         
        flags     : [],         
        created   : timeStamp,
        updated     : timeStamp
      };
    return this._DB.put(plan).then(response => {
        return response.id
    })
  }

和then()的响应将等于id:

 this.addPlan('My plan title9', "YES9").then((id)=>{
      console.log('Promise return was: ' + id);
    })