2015-08-18 2 views
1

Я попытался узнать о обещаниях, и мне тяжело сейчас. Вот мой пример, который не работает:пример javascript-обещания с пропуском bluebird «then»

<html> 
    <head> 
    <title>test page</title> 
    </head> 
    <body> 
    <script type="text/javascript" src="bluebird.js"></script> 
    <script type="text/javascript" > 
     function doTheThing() { 
     return new Promise (function (resolve, reject) { 
      setTimeout(function(){alert("2");},1000) 
      alert("1"); 
     }); 
     } 
     doTheThing().then(
     function() { 
      alert("3"); 
     }, function(error) { 
      alert("5"); 
     } 
    ); 
    </script> 
    </body> 
</html> 

Это предупреждает «1», а затем «2» и это все.

Почему «3» никогда не предупреждали? Почему then() не выполняется вообще?

+4

Поскольку ваше обещание не разрешено и не отклонено? –

ответ

3

Вы должны разрешить обещание:

function doTheThing() { 
    return new Promise (function (resolve, reject) { 
    setTimeout(function(){ 
     alert("2"); 
     resolve(); 
    }, 1000) 
    alert("1"); 
    }); 
} 

Представьте, если ваш код принял аргумент обратного вызова, а не возвращать Promise:

function doTheThing (doneCallback) { 
    setTimeout(function(){ 
    alert("2"); 
    doneCallback(); 
    }, 1000); 
    alert("1"); 
} 

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

2

A Promise должен быть resolved или rejected, прежде чем он продолжит выполнение следующего then успешного или обработчика ошибок. Поэтому в вашей функции doTheThing вам необходимо позвонить resolve. Я немного изменил ваш код, чтобы продемонстрировать, что, вызывая resolve, вы передаете управление обработчику успеха, что видно из того, что значение 3 предоставляется по телефону resolve("3").

function doTheThing() { 
    return new Promise (function (resolve, reject) { 
     setTimeout(function(){alert("2");},1000) 
     alert("1"); 
     resolve("3"); 
    }); 
} 

doTheThing().then(function(value) { 
    alert(value); 
}, function(error) { 
    alert("5"); 
}); 
0
new Promise (function (fulfill, reject) { 
    setTimeout(function(){alert("2");},1000) 
    alert("1"); 
}); 

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

Узнать больше о обещаниях here или here

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