2015-12-01 2 views
4

Я новичок в Promise. Я написал два примера:Смущенный, когда обещаю от setTimeout

Первый из них:

new RSVP.Promise(function (resolve, reject) { 
    setTimeout(function() { 
     resolve("HI") 
    }, 3000); 
}).then(function (result) { 
    console.log(result); 
}); 

Это один напечатает «HI» через 3 секунды, как я ожидал. Это происходит потому, что «затем» ждет его и называется только тогда, когда обещание оседает.

Второй является:

new RSVP.Promise(function (resolve, reject) { 
    resolve(); 
}).then(function() { 
    return RSVP.Promise(function (resolve, reject) { 
     setTimeout(function() { 
      resolve("HI") 
     }, 3000); 
    }); 
}).then(function (result) { 
    console.log(result); 
}); 

Я думал, что он будет печатать "HI" через 3 секунды. Но ничего не случилось. Я думал, что второе «потом» будет ждать обещания в первом «потом».

Что не так для второго примера и как его исправить?

+0

Я пробовал его без RSVP, используя собственные обещания, и он работает на chrome http://codepen.io/anon/pen/MaNxJJ – Carlo

+0

Yup, как сказал вам, вы пропустили «новый». Когда я справляюсь с кодепином, я исправил его, не задумываясь. – Carlo

ответ

6

Т.Л., др

Вы должны построить RSVP обещания с new оператором.

Исправлен код

new RSVP.Promise(function (resolve, reject) { 
    resolve(); 
}).then(function() { 
    // Note the `new` in the next line 
    return new RSVP.Promise(function (resolve, reject) { 
     setTimeout(function() { 
      resolve("HI") 
     }, 3000); 
    }); 
}).then(function (result) { 
    console.log(result); 
}).catch(console.error); 

В вашем случае, это ничего не делало, потому что создание обещания в then обработчика не удалось, так как new не использовалось с этим. Поскольку обработчик then бросает исключение, он возвратил неудачное обещание. Вот почему следующий обработчик then также не был выполнен.

Когда я выполнил ваш исходный код с прилагаемым обработчиком catch, как я показал выше, я получил следующую ошибку.

[TypeError: Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.]

Эмпирическая: Всегда используйте catch обработчик, когда вы имеете дело с обещаниями.

0

В вашем втором примере у вас есть функция, которая возвращает обещание внутри функции then(), но это обещание не подвергается процессу then(), поэтому, когда он разрешает, для его действия нет действий. то() фактически возвращает свое собственное обещание, которое позволяет цепочки работать. В случае второго примера результат во втором затем() должен быть обещанием, которое вы вернули в первом затем()

Смежные вопросы