2017-01-09 3 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

Вам не нужно создавать новый Promise

вы можете просто вернуть "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); 
    }) 
Смежные вопросы