이의 순수 자바 스크립트 예제에 약속의 예를 비교해 보자 : 노 베르트있는 Hartl는 지적
이
// First we need a convenience function for W3C's fiddly XMLHttpRequest.
// It works a little differently from the promise framework. Instead of
// returning a promise to which we can attach a handler later with .then(),
// the function accepts the handler function as an argument named 'callback'.
function requestSomeDataAndCall(url, callback) {
var req = new XMLHttpRequest();
req.onreadystatechange = resHandler;
req.open("GET", url, false);
req.send();
function resHandler() {
if (this.readyState==4 && this.status==200) {
callback(this);
} else {
// todo: Handle error.
}
}
}
requestSomeDataAndCall("http://example.com/foo", function(res){
setTimeout(function(){
var data = JSON.parse(res.responseText);
setTimeout(function(){
var price = data.price;
setTimeout(function(){
print("The price is "+price);
},10);
},10);
},10);
});
, JSON.parse()가 큰 문자열 브라우저를 중단됩니다. 그래서 setTimeout()을 사용하여 실행을 지연 시켰습니다 (10 밀리 초의 일시 중지 이후). 이것은 Kris Kowal의 솔루션의 한 예입니다. 콜백이 실행되기 전에 현재 자바 스크립트 스레드가 완료되어 브라우저에서 DOM 변경 사항을 표시하고 사용자를 위해 페이지를 스크롤 할 수 있습니다.
commonjs 약속 프레임 워크에서도 setTimeout과 같은 것을 사용하기를 바랍니다. 그렇지 않으면 기사 예제의 나중 약속이 실제로 두려움에 따라 동 기적으로 실행됩니다.
내 위의 대체 방법은 꽤 추한 것처럼 보입니다. 이후 프로세스는 들여 쓰기가 더 필요합니다. 내가 자바 스크립트에서 콜백의 전통 앞으로 전달을 보여 기대하고 있었는데
function makeResolver(chain) {
function climbChain(input) {
var fn = chain.shift(); // This particular implementation
setTimeout(function(){ // alters the chain array.
var output = fn(input);
if (chain.length>0) {
climbChain(output);
}
},10);
}
return climbChain;
}
var processChain = [
function(response){
return JSON.parse(response.body);
},
function(data){
return data.price; // get the price
},
function(price){
print("The price is " + price);
}
];
var climber = makeResolver(promiseChain);
requestSomeDataAndCall("http://example.com/foo", climber);
하는 약속을 거의 동일합니다 : 우리가 모두 하나 개의 수준에서 우리의 프로세스 체인을 제공 할 수 있도록 내가 코드를 재구성. 그러나 두 번의 시도 후에 나는 본보기의 코드의 깔끔함과 관련하여 약속이 훨씬 더 우아한 해결책이라는 것을 보여준 것처럼 보입니다!
당신 맞습니다. 동기 작업에 약속을 사용하는 데는 아무런 포인트가 없습니다. 따라서 결과는 동일해야합니다. 그러나 그것은 예이며 약속의 사용법을 설명합니다. 귀하의 예제 다음에 실행되는 코드에는 실제로 차이가 있습니다. 예제 코드가 무엇을하는지 알지 못해서 (promise 접근법을 사용하여) 할 수있는 것보다 예제 후에 뭔가를 실행할 필요가 있다면 –