2017-01-09 190 views
0

我不能解決我做錯了我的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 \t = new Date().toISOString(); 
 
    let plan \t \t = { 
 
     _id \t \t : 'PLAN:' + timeStamp, 
 
     title \t \t : title, 
 
     security \t : security, 
 
     notes  : [],   
 
     flags  : [],   
 
     created : timeStamp, 
 
     updated \t : 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消息,但我希望它在承諾返回後出現。

顯然,我在這裏做一個新手的錯誤,但我看不出它是什麼。

回答

2

錯誤是if(this.success)因爲你處理異步代碼就好像它是同步的。您創建的新承諾塊內的所有內容都將同步運行。

望着輸出,它應該是相當簡單的理解發生了什麼:

  1. if將評估爲true和解決尚未確定 值。
  2. 函數調用put()完成並將響應記錄到控制檯。

您還在執行deferred anti-pattern。因爲put()函數已經返回一個函數,所以不需要創建新的承諾。只需返回那一個,並返回.then()內的響應,它會將其包裝在承諾中並予以解決。我在下面的代碼中省略了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

您不必創建一個新的承諾

你可以返回 「this._DB.put(計劃)」 的承諾:

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

和響應,然後()將相等於ID:

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