我有点开始学习 javascript 并且有一个关于组契约(Contract)步和异步函数调用的问题。这将只是一个理论问题,但我希望它能传递思想。
假设我们有一个 javascript 程序来决定我需要购买多少香蕉和橙子。
console.log('buy %d bananas and %d oranges', bananas, oranges)
现在,我可以决定我能买多少香蕉,但我需要问我妻子她想要多少橘子,所以我给她发了短信。 (我可以写一个异步函数来表示这个)。
这将是我的直接方法:
var bananas = 10;
var oranges = 0;
textWife('askAboutOranges',function(number){ oranges = number; }
console.log('buy %d bananas and %d oranges', bananas, oranges)
但对我来说这没有意义,因为我必须等待我妻子的回复,所以我可能无法及时得到橙子的数量。
所以我可以将我的程序更改为:
var bananas = 10;
var oranges = 0;
textWife('askAboutOranges',function(number){
oranges = number;
console.log('buy %d bananas and %d oranges', bananas, oranges);
}
但我不喜欢这样,因为现在我有根据我妻子的回复来决定买什么(包括香蕉)的逻辑。如果我决定不想要橘子怎么办,我是否必须这样做:
var bananas = 10;
var oranges = 0;
if (wantOranges)
{
textWife('askAboutOranges',function(number){
oranges = number;
console.log('buy %d bananas and %d oranges', bananas, oranges);
}
}
else
console.log('buy %d bananas and %d oranges', bananas, oranges);
所以我的问题是,任何人都可以向我解释执行此类操作的最佳/正确方法是什么吗?
最佳答案
jQuery Deferred是随身携带的好工具。我可能会做这样的事情来分离关注点:
function decideHowManyBananas() {
return 10;
}
function decideHowManyOranges() {
var deferred = $.Deferred();
if (wantOranges) {
textWife('askAboutOranges', function(number) {
deferred.resolve(number);
});
} else {
deferred.resolve(0);
}
return deferred.promise();
}
$.when(decideHowManyBananas(), decideHowManyOranges()).done(function(bananas, oranges) {
console.log('buy %d bananas and %d oranges', bananas, oranges);
});
关于javascript - 如何在javascript中将异步调用与同步调用结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559207/