2016-03-01 3 views
2

Пусть некоторый код делаетКак узнать, разрешено ли обещание?

// promise.js 
let p = new Promise(() => { /* ... */ }) 
export default p 

где Promise является ES6 Promise. Предположим, что какой-либо другой код имеет ссылку только на p. Как этот код может сказать, разрешен ли p или нет?

// other.js 
import p from './promise.js' 
// console.log('p is resolved?', ______) 

Есть ли что-то мы можем заполнить пробел с, что бы показать истинные или ложные в зависимости от того, устранено ли обещание или нет?

ответ

2

Конструктор обещаний ES6 не имеет свойства, которое может сказать вам состояние обещания. Вам нужно сделать что-то вроде этого:

import p from './promise.js' 
var isResolved = false; 
p.then(function() { 
    isResolved = true; 
}); 

// ... At some point in the future. 
console.log('p is resolved?', isResolved); 

Существует внутреннее свойство называется PromiseState, но вы не можете получить доступ к нему. Here is the spec.

+1

Это всегда возвращает false. Поместите console.log внутри 'then' import p from './promise.js' var isResolved = false; p.then (функция() { isResolved = true; console.log ('p разрешен?', IsResolved); }); –

+1

Помогите мне исправить себя здесь. Почему вы думаете, что это всегда вернет ложь? – nstoitsev

+1

, потому что javascript является асинхронным и будет выполнять console.log даже до того, как обещание будет разрешено и в то время isResolved имеет значение «false» –

5

Цитируя документацию MDN:

дизайна, мгновенное состояние и значение обещания не могут быть проверены синхронно с кода, без вызова метода затем().

Таким образом, вам необходимо позвонить по методу .then.

+0

Оба ответа были хорошими, поэтому я перевернул монету и приземлился на другой ответ. Спасибо за ответ, хотя! – trusktr

+0

Оба могут быть хорошими, но тот, который вы приняли, ошибочен. –

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