2012-09-17 23 views
8

tôi một số vấn đề tìm hiểu làm thế nào để sử dụng "q" (https://github.com/kriskowal/q) một hứa hẹn cho thư viện javascript:Làm cách nào để thực hiện chuỗi gọi lại với q?

var delayOne = function() { 
    setTimeout(function() { 
     return 'hi'; 
    }, 100); 
}; 

var delayTwo = function(preValue) { 
    setTimeout(function() { 
     return preValue + ' my name'; 
    }, 200); 
}; 

var delayThree = function(preValue) { 
    setTimeout(function() { 
     return preValue + ' is bodo'; 
    }, 300); 
}; 

var delayFour = function(preValue) { 
    setTimeout(function() { 
     console.log(preValue); 
    }, 400); 

}; 

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).end(); 

chỉ lợi nhuận này không xác định ...

Trả lời

9

Các lý do bạn nhận được "không xác định" là bởi vì các chức năng bạn đang chaining được kết không quay trở lại bất cứ điều gì:

var delayOne = function() { 
    setTimeout(function() { 
    return 'hi'; 
    }, 100); 
}; 

delayOne cuộc gọi setTimeout, và trả về không có gì (undefined).

Để đạt được mục tiêu của bạn, bạn phải sử dụng Q.defer:

var delayOne = function() { 
    var d = Q.defer();  
    setTimeout(function() { 
    d.resolve("HELLO"); 
    }, 100); 
    return d.promise; 
}; 

var delayTwo = function(preValue) { 
    setTimeout(function() { 
    alert(preValue); 
    }, 
    400); 
}; 

delayOne().then (delayTwo); 

http://jsfiddle.net/uzJrs/2/

+0

cảm ơn bạn đã giải pháp. Bên cạnh đó tôi phải làm quyết định nếu tôi sử dụng Q điều gì sẽ cải thiện chất lượng mã của tôi rất nhiều ở phía bên kia nó sẽ dẫn đến một sự phụ thuộc khó khăn. Bạn có kinh nghiệm nếu vấn đề này? – bodokaiser

+1

nếu bạn sử dụng nhiều chuỗi, các cuộc gọi async, sau đó bạn sẽ cần một số thư viện để thoát khỏi 'Kim tự tháp của Doom' :). Cá nhân tôi thích asyncjs: https://github.com/caolan/async, và tôi đã sử dụng nó với thành công trên một số dự án cỡ trung bình. – wroniasty

12

Như wroniasty chỉ ra, bạn cần phải trả lại một lời hứa từ mỗi trong những chức năng, nhưng bạn cũng nên trừu tượng nào gọi lại định hướng API (như setTimeout) càng nhiều càng tốt và sử dụng API trả lại lời hứa thay thế.

Trong trường hợp của setTimeout, Q đã cung cấp Q.delay(ms) mà trả về một lời hứa rằng sẽ được giải quyết sau khi số quy định của mili giây, hoàn hảo để thay thế setTimeout:

var delayOne = function() { 
    return Q.delay(100).then(function() { 
     return 'hi'; 
    }); 
}; 

var delayTwo = function(preValue) { 
    return Q.delay(200).then(function() { 
     return preValue + ' my name'; 
    }); 
}; 

var delayThree = function(preValue) { 
    return Q.delay(300).then(function() { 
     return preValue + ' is bodo'; 
    }); 
}; 

var delayFour = function(preValue) { 
    return Q.delay(400).then(function() { 
     console.log(preValue); 
    }); 
}; 

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).done(); 

(lưu ý: end đã được thay thế bằng done)