2013-08-22 30 views
8

Tôi gặp khó khăn khi chạy các lời hứa tuần tự.Làm thế nào để chạy liên tục lời hứa với Q trong Javascript?

var getDelayedString = function(string) { 
    var deferred = Q.defer(); 

    setTimeout(function() { 
     document.write(string+" "); 
     deferred.resolve(); 
    }, 500); 

    return deferred.promise; 
}; 

var onceUponATime = function() { 
    var strings = ["Once", "upon", "a", "time"]; 

    var promiseFuncs = []; 

    strings.forEach(function(str) { 
     promiseFuncs.push(getDelayedString(str)); 
    }); 

    //return promiseFuncs.reduce(Q.when, Q()); 
    return promiseFuncs.reduce(function (soFar, f) { 
     return soFar.then(f); 
    }, Q());  
}; 

getDelayedString("Hello") 
.then(function() { 
    return getDelayedString("world!") 
}) 
.then(function() { 
    return onceUponATime(); 
}) 
.then(function() { 
    return getDelayedString("there was a guy and then he fell.") 
}) 
.then(function() { 
    return getDelayedString("The End!") 
}) 

onceUponATime() nên tuần tự đầu ra [ "Một lần", "trên", "a", "thời gian"] nhưng thay vào đó họ đang được đầu ra ngay lập tức đối với một số lý do.

jsFiddle đây: http://jsfiddle.net/6Du42/2/

Bất kỳ ý tưởng những gì tôi đang làm sai?

Trả lời

15

nhưng thay vào đó chúng được xuất ngay lập tức vì một số lý do.

Bạn đang gọi họ đã ở đây:

promiseFuncs.push(getDelayedString(str)); 
//        ^^^^^ 

Bạn sẽ cần phải đẩy function(){ return getDelayedString(str); }. Btw, thay vì sử dụng đẩy vào một mảng trong vòng lặp each, bạn nên sử dụng map. Và trên thực tế bạn không thực sự cần điều đó anyway nhưng có thể reduce qua strings mảng trực tiếp:

function onceUponATime() { 
    var strings = ["Once", "upon", "a", "time"]; 

    return strings.reduce(function (soFar, s) { 
     return soFar.then(function() { 
      return getDelayedString(s); 
     }); 
    }, Q());  
} 

Oh, và don't use document.write.

+0

Cảm ơn câu trả lời và gợi ý bổ sung! – Nick

+1

vâng, nó phải là một chức năng * nhà máy * để làm việc, nếu không nó sẽ thực hiện ngay lập tức. – FlavorScape

Các vấn đề liên quan